MySQL动态插入:将centraldb中tifa_前缀表同步至同名_hist表
解决办法
1. 用存储过程批量同步所有表
70多张表手动写INSERT太折腾,直接整个存储过程自动生成并执行同步逻辑:
DELIMITER // CREATE PROCEDURE SyncTifaToHist() BEGIN DECLARE done INT DEFAULT FALSE; DECLARE src_table VARCHAR(255); DECLARE dest_table VARCHAR(255); DECLARE col_list VARCHAR(10000); DECLARE insert_sql VARCHAR(10000); -- 遍历所有tifa_前缀的表 DECLARE table_cursor CURSOR FOR SELECT table_name FROM information_schema.tables WHERE table_schema = 'centraldb' AND table_name LIKE 'tifa_%'; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; OPEN table_cursor; read_loop: LOOP FETCH table_cursor INTO src_table; IF done THEN LEAVE read_loop; END IF; -- 生成目标表名:比如tifa_user → tifa_user_hist SET dest_table = CONCAT(src_table, '_hist'); -- 获取源表中除`as_of_date`外的所有列名,拼接成字符串 SELECT GROUP_CONCAT(column_name SEPARATOR ', ') INTO col_list FROM information_schema.columns WHERE table_schema = 'centraldb' AND table_name = src_table AND column_name != 'as_of_date'; -- 生成插入SQL,指定`as_of_date`为执行当日的前一天 SET insert_sql = CONCAT( 'INSERT INTO centraldb.', dest_table, '(', col_list, ', as_of_date) ', 'SELECT ', col_list, ', DATE_SUB(CURDATE(), INTERVAL 1 DAY) ', 'FROM centraldb.', src_table, ';' ); -- 执行生成的SQL语句 SET @sql = insert_sql; PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; END LOOP; CLOSE table_cursor; END // DELIMITER ;
2. 使用步骤
- 先在MySQL客户端执行上述代码,创建存储过程
- 调用存储过程启动同步:
CALL SyncTifaToHist();
3. 注意事项
- 确保所有
_hist结尾的目标表已创建,结构与对应tifa_前缀的源表一致,且必须包含as_of_date字段(建议设置为DATE类型) - 如果需要增量同步(仅同步新增/更新的数据),可在SELECT语句后添加WHERE过滤条件,比如基于表内的更新时间字段筛选
- 执行前务必在测试环境验证逻辑,避免生产数据异常
- 若存在个别表结构与其他表不一致的情况,可在存储过程中添加判断逻辑,跳过或单独处理这类表
内容的提问来源于stack exchange,提问作者Ella Shulman
相关产品推荐
相关产品推荐

