背景:
比如生产库数据和测试库数据,我现在有脚本的变更或者优化,我先再需要比较同一批次的数据是否一致
思路:
每一条比对上的字段对应的数据都需要一致,于是我先比对每一条字段的数据是否一致,然后对字段进行循环即可。
大体代码奉上:
CREATE DEFINER=`***项目必要,已隐藏**`@`%` PROCEDURE `compare_twotb_data`(
IN `TABLE1` VARCHAR(50),
IN `TABLE2` VARCHAR(50),
IN `timestr` VARCHAR(50)
)
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT '比较两张表的数据是否一致'
BEGIN
DECLARE cnt INT;
DECLARE colname VARCHAR (100) DEFAULT NULL ;
DECLARE done INT DEFAULT 0;
-- 声明游标
DECLARE cur CURSOR FOR
select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME = TABLE1
AND COLUMN_NAME NOT IN ('ID','COMCODE','ENDDATA','DATAFLAG');
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
-- 打开游标
OPEN cur ;
-- 使用repeat循环语法
REPEAT
-- 批读取数据到指定变量上
FETCH cur INTO colname;
set @stmt = CONCAT('SELECT COUNT(1) FROM ',TABLE1,' a
INNER JOIN ',TABLE2,' b ON a.COMCODE = b.COMCODE
‘/*
此处省略(原为两字段的匹配项)
*/’
WHERE a.ENDDATE = ',timestr,'
AND a.',colname ,' != b.' ,colname, ' into @cnt;');
PREPARE stmt1 FROM @stmt;
EXECUTE stmt1;
deallocate prepare stmt1;
SET cnt = @cnt;
if cnt > 0 then
INSERT INTO compare_table_date_log(TABLE1,TABLE2,COLNAME,diffcnt)
VALUES(TABLE1,TABLE2,colname,cnt);
END if;
-- 循环结束条件
UNTIL done
END REPEAT ;
-- 关闭游标
CLOSE cur ;
END
代码的大体思路:
1、通过传递参数,比如要参与比对的表1,表2,批次号
2、将表字段放入游标中
3、通过动态SQL编写比对的逻辑(这边请自由发挥),把存在不一致数据的行数放到日志表中。
优点:
对于每次都需要上线的功能,对新数据以及老数据要进行详细的测试和比对,开发一个脚本,能够快速发现数据的不一致,方便且高效。
不足和改进:
以上的代码只是一个最初的版本,对于大量的表兼容性不足,如果可以通过传参自行配置就更好了。过几天我有时间用Python写一个类似的兼容性更强的脚本。毕竟DBA不建议写存过。
版权声明:本文为qq_41902618原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。