注:仅适合本地测试,数据量少、线上环境禁用;

思路:
先筛表缩小范围,再找就好了 ;;

高级模糊搜字段:
SELECT
    table_name,
    column_name
FROM
    information_schema.columns
WHERE
    table_schema = DATABASE()
    -- 核心处理逻辑:
    -- 1. 将 column_name 中的所有下划线移除(REPLACE(column_name, '_', ''))
    -- 2. 将结果转换为小写(LOWER(...))
    -- 3. 与搜索词(同样经过处理)进行 LIKE 匹配
    AND LOWER(REPLACE(column_name, '_', '')) LIKE CONCAT('%', LOWER(REPLACE('testfiled', '_', '')), '%');
    

存储过程脚本 ,查询非空表;

DELIMITER $$

-- 如果已存在同名存储过程,先删除
DROP PROCEDURE IF EXISTS SearchColumnWithData$$

-- 定义带参数的存储过程
CREATE PROCEDURE SearchColumnWithData(IN searchKeyword VARCHAR(100))
BEGIN
    -- 定义变量
    DECLARE done INT DEFAULT FALSE;
    DECLARE target_table VARCHAR(255);
    DECLARE target_col VARCHAR(255);
    -- 游标
    DECLARE cur CURSOR FOR 
        SELECT table_name, column_name
        FROM information_schema.columns 
        WHERE table_schema = DATABASE()
        -- 这里使用传入的 searchKeyword 参数,替换原来的固定字符串
        AND LOWER(REPLACE(column_name, '_', '')) LIKE CONCAT('%', LOWER(REPLACE(searchKeyword, '_', '')), '%');
        
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    
    -- 创建临时表存结果
    DROP TEMPORARY TABLE IF EXISTS temp_search_result;
    CREATE TEMPORARY TABLE temp_search_result (
        tbl_name VARCHAR(255),
        col_name VARCHAR(255),
        row_count INT
    );

    OPEN cur;
    
    read_loop: LOOP
        FETCH cur INTO target_table, target_col;
        IF done THEN
            LEAVE read_loop;
        END IF;
        
        -- 动态构建 SQL:查询该表的总行数
        SET @s = CONCAT('INSERT INTO temp_search_result SELECT ''', target_table, ''', ''', target_col, ''', COUNT(*) FROM ', target_table);
        
        -- 执行动态 SQL
        PREPARE stmt FROM @s;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
        
    END LOOP;

    CLOSE cur;

    -- 输出结果:只显示有数据的表
    SELECT * FROM temp_search_result WHERE row_count > 0 ORDER BY row_count DESC;
    
    -- 清理
    DROP TEMPORARY TABLE IF EXISTS temp_search_result;
END$$

DELIMITER ;

使用方法:

CALL SearchColumnWithData('fdUnionId');

方法三:
在这里插入图片描述

方法四,大力出奇迹:

DELIMITER //

DROP PROCEDURE IF EXISTS SearchCurrentDB //

CREATE PROCEDURE SearchCurrentDB(
    IN p_search_val VARCHAR(255),
    IN p_exclude_tables TEXT -- 新增:排除表参数,格式如 'table1,table2'
)
BEGIN
    -- 声明变量
    DECLARE v_table_name VARCHAR(255);
    DECLARE v_where_clause MEDIUMTEXT;
    DECLARE v_done INT DEFAULT 0;
    DECLARE v_db_name VARCHAR(255);
    DECLARE v_exclude_clean TEXT;

    -- 获取库名
    SELECT DATABASE() INTO v_db_name;
    IF v_db_name IS NULL THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '请先选中数据库!';
    END IF;

    -- 【参数清洗】去除排除列表中的空格,防止 'tableA, tableB' 导致匹配失败
    SET v_exclude_clean = REPLACE(IFNULL(p_exclude_tables, ''), ' ', '');

    -- 【配置】防止字段过多导致 GROUP_CONCAT 截断
    SET SESSION group_concat_max_len = 1000000;
    
    -- 设置全局搜索变量
    SET @search_pattern = CONCAT('%', p_search_val, '%');

    -- 创建临时表存放结果
    DROP TEMPORARY TABLE IF EXISTS TempSearchResults;
    CREATE TEMPORARY TABLE TempSearchResults (
        TableName VARCHAR(255),
        MatchCount INT
    );

    -- =======================================================
    -- 核心逻辑:游标遍历
    -- =======================================================
    BEGIN
        DECLARE table_cursor CURSOR FOR 
            SELECT 
                t.TABLE_NAME,
                -- 拼接该表所有字段的 OR 查询条件
                GROUP_CONCAT(CONCAT('CAST(`', c.COLUMN_NAME, '` AS CHAR) LIKE @search_pattern') SEPARATOR ' OR ')
            FROM information_schema.COLUMNS c
            JOIN information_schema.TABLES t 
              ON c.TABLE_NAME = t.TABLE_NAME AND c.TABLE_SCHEMA = t.TABLE_SCHEMA
            WHERE c.TABLE_SCHEMA = v_db_name 
              AND t.TABLE_TYPE = 'BASE TABLE'
              -- 【新增优化】在此处直接排除指定的表,不进入后续逻辑
              AND (
                  v_exclude_clean = '' 
                  OR NOT FIND_IN_SET(t.TABLE_NAME, v_exclude_clean)
              )
            GROUP BY t.TABLE_NAME;

        DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = 1;

        OPEN table_cursor;

        search_loop: LOOP
            FETCH table_cursor INTO v_table_name, v_where_clause;

            IF v_done = 1 THEN
                LEAVE search_loop;
            END IF;

            -- 只有当表有字段且生成了查询条件时才执行
            IF v_where_clause IS NOT NULL THEN
                -- 构造动态 SQL 查询当前表匹配行数
                SET @sql_search = CONCAT(
                    'SELECT COUNT(*) INTO @cnt FROM `', v_db_name, '`.`', v_table_name, '` WHERE ', v_where_clause
                );

                -- 执行动态 SQL
                PREPARE stmt FROM @sql_search;
                EXECUTE stmt;
                DEALLOCATE PREPARE stmt;

                -- 只有匹配数大于0才记录
                IF @cnt > 0 THEN
                    INSERT INTO TempSearchResults VALUES (v_table_name, @cnt);
                END IF;
            END IF;

        END LOOP;

        CLOSE table_cursor;
    END;

    -- 输出最终结果
    SELECT 
        TableName AS '表名', 
        MatchCount AS '匹配行数'
    FROM TempSearchResults
    ORDER BY MatchCount DESC;

    -- 清理资源
    DROP TEMPORARY TABLE IF EXISTS TempSearchResults;

END //

DELIMITER ;

– 搜索 “admin”
CALL SearchCurrentDB(‘admin’, NULL);
CALL SearchCurrentDB(‘admin’, ‘tableA,tableB’); ,后面代表排除tablea、tableb大日志表等

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐