比较两个表的数据是否一致(MySQL存过实现)

背景:

比如生产库数据和测试库数据,我现在有脚本的变更或者优化,我先再需要比较同一批次的数据是否一致

思路:

每一条比对上的字段对应的数据都需要一致,于是我先比对每一条字段的数据是否一致,然后对字段进行循环即可。
大体代码奉上:
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版权协议,转载请附上原文出处链接和本声明。