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

22 篇文章 0 订阅
7 篇文章 0 订阅
背景:
比如生产库数据和测试库数据,我现在有脚本的变更或者优化,我先再需要比较同一批次的数据是否一致
思路:
每一条比对上的字段对应的数据都需要一致,于是我先比对每一条字段的数据是否一致,然后对字段进行循环即可。
大体代码奉上:
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不建议写存过。
  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值