mysql表字段反查表名脚本-筛选法-查表技巧
先筛表缩小范围,再找就好了;
·
注:仅适合本地测试,数据量少、线上环境禁用;
思路:
先筛表缩小范围,再找就好了 ;;
高级模糊搜字段:
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大日志表等
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)