2016 - 2024

感恩一路有你

mysql两个表如何合并到一起 MySQL快速对比数据技巧?

浏览量:2135 时间:2023-05-18 11:49:50 作者:采采

在MySQL运维中,R ampamp同事们想比较两个不同实例的数据,找出不同之处。除了主键,他们还需要比较每个字段。如何做到这一点?

第一种方案是写程序比较两个例子中的每一行数据,理论上可行,但是比较时间长。

第二种方案是将每一行数据的所有字段进行组合,取校验和值,然后根据校验和值进行比较。似乎可行,不妨一试。

首先要结合所有字段的值,选择MySQL提供的CONCAT函数。如果CONCAT函数包含空值,那么最终结果将是NULL,所以我们需要使用IFNULL函数来替换空值,比如。

CONCAT(IFNULL(C1,),IFNULL(C2,)

表格里有很多行,手动拼一个脚本很累。唐 别担心,你可以用信息来处理它:

# #获取列名的串联字符串:select group _ concat (ifnull(,column _ name,,))from information _ where table _ name table _ name。

假设我们有一个测试表:

创建表t_test01 ( id INT AUTO_INCREMENT主键,C1 INT,C2 INT)

我们可以拼凑出下面的。

从t_test01中选择id,MD5(CONCAT( IFNULL(id,),IFNULL(c1,),IFNULL(c2,))作为md5_value

通过在两个实例上执行并使用beyond compare比较结果,很容易找出不同的行和主键ID。

对于数据量大的表,执行的结果集也很大,比较困难。请首先尝试减少结果集。您可以组合多行记录的md5值来查找MD5值。如果最后MD5值相同,这几行也相同。如果不一样,那就证明有区别,然后逐行比较。

假设我们以1000行为一组来比较结果。如果我们需要合并分组的结果,我们需要使用GROUP_CONCAT函数。注意在GROUP_CONCAT函数中加入排序,保证合并数据的顺序。SQL如下所示:

选择min(id)作为min_id,max(id)作为max_id,count(1)作为row_count,MD5(GROUP_CONCAT( MD5(CONCAT( IFNULL(id,),IFNULL(c1,),IFNULL(c2,,))ORDER BY id))作为来自t_test01 GROUP BY (id div 1000)的md5_value

实施结果是:

min _ id max _ id row _ count MD5 _ value 0 999 1000 7d 49 def 23611 f 610849 ef 559677 fec0c 1000 1999 1000 95d 61931 aa D3 b48 f1 e 38 b 3550 daee 08 2000 2999 1000 b 02612548 f ae8a 4455418365 B3 AE 611 a 3000 3999 1000

当差异数据很少的时候,即使需要比对几千万条数据,我们也可以根据min_id和max_id轻松定位哪1000条数据有差异,然后逐行比对MD5值,最终找到差异行。

使用GROUP_CONCAT时,需要配置MySQL变量

Or不带索引,你可以把or的条件分成两个sql,用union合并。

数据 主键 MD5 CONCAT IFNULL

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。