如何查询多个前缀命名动态生成表中的identifier列?
解决批量查询前缀匹配表的identifier列问题
你之前的查询只是从information_schema拿到了表名,并没有实际去查询这些表的内容。要实现跨表提取所有identifier数据,得用动态SQL来拼接查询语句——因为MySQL无法直接把字符串形式的表名当作查询对象。
方法1:用存储过程自动拼接执行
创建一个存储过程,它会自动遍历所有t开头的表,拼接出跨表查询的SQL并执行:
DELIMITER // CREATE PROCEDURE GetAllIdentifiers() BEGIN DECLARE done INT DEFAULT FALSE; DECLARE tableName VARCHAR(255); DECLARE sqlStmt TEXT DEFAULT ''; -- 声明游标,遍历当前库下符合条件的表 DECLARE cur CURSOR FOR SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_NAME LIKE 't%' AND TABLE_SCHEMA = DATABASE(); DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; OPEN cur; read_loop: LOOP FETCH cur INTO tableName; IF done THEN LEAVE read_loop; END IF; -- 拼接UNION ALL语句,第一个表不需要前缀 IF sqlStmt = '' THEN SET sqlStmt = CONCAT('SELECT `identifier` FROM `', tableName, '`'); ELSE SET sqlStmt = CONCAT(sqlStmt, ' UNION ALL SELECT `identifier` FROM `', tableName, '`'); END IF; END LOOP; CLOSE cur; -- 执行拼接好的SQL PREPARE stmt FROM sqlStmt; EXECUTE stmt; DEALLOCATE PREPARE stmt; END // DELIMITER ;
调用这个存储过程就能拿到所有数据:
CALL GetAllIdentifiers();
方法2:手动拼接SQL(临时查询用)
如果不想创建存储过程,先查所有目标表名:
SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_NAME LIKE 't%' AND TABLE_SCHEMA = DATABASE();
然后把结果手动拼成下面的格式执行:
SELECT `identifier` FROM `t1` UNION ALL SELECT `identifier` FROM `t2` UNION ALL SELECT `identifier` FROM `t343` -- 继续添加其他匹配到的表...
注意点
- 用
UNION ALL而非UNION:既然你说identifier跨表唯一,UNION ALL性能更高,不会做无意义的去重操作。 - 限定当前数据库:
TABLE_SCHEMA = DATABASE()能避免查到其他库的同名表。 - 表数量极大时:要检查MySQL的
max_allowed_packet参数,确保能容纳拼接后的长SQL。
内容的提问来源于stack exchange,提问作者Lars
相关产品推荐
相关产品推荐

