比较导入的数据库-(是否可以指纹?)



来源:Windows网络共享上的MS Access

目标:Ubuntu 上的MySQL/MariaDB

工具:mdb导出、mysqlimport

记录数:150万+

我想知道是否有一种快速可靠的方法来比较导入的数据记录。

是否有类似于文件的md5指纹散列的SQL标准?现在,我正在构建不同的导入例程,我只想快速检查相似性,然后(如果失败(搜索详细的差异。

可以使用存储的聚合函数来实现对单个列的某种快速而肮脏的方法,该函数应该是SQL标准。

这就是你对MariaDB:的处理方式

CREATE AGGREGATE FUNCTION IF NOT EXISTS my_checksum(x TEXT) RETURNS CHAR(40)
DETERMINISTIC
BEGIN
DECLARE cksum CHAR(40) DEFAULT SHA1('');
DECLARE CONTINUE HANDLER FOR NOT FOUND
RETURN cksum;
LOOP
FETCH GROUP NEXT ROW;
SET cksum = SHA1(CONCAT(cksum, x));
END LOOP;
END

然后,您可以根据以下列计算校验和:

MariaDB [test]> create or replace table t1(data varchar(20));
Query OK, 0 rows affected (0.063 sec)
MariaDB [test]> create or replace table t2(data varchar(20));
Query OK, 0 rows affected (0.064 sec)
MariaDB [test]> insert into t1 values ('hello'), ('world'), ('!');
Query OK, 3 rows affected (0.011 sec)
Records: 3  Duplicates: 0  Warnings: 0
MariaDB [test]> insert into t2 values ('Hello'), ('World'), ('!');
Query OK, 3 rows affected (0.015 sec)
Records: 3  Duplicates: 0  Warnings: 0
MariaDB [test]> select my_checksum(data) from t1;
+------------------------------------------+
| my_checksum(data)                        |
+------------------------------------------+
| 7f6fb9a61c2097f70a36254c332c47364c496e07 |
+------------------------------------------+
1 row in set (0.001 sec)
MariaDB [test]> select my_checksum(data) from t2;
+------------------------------------------+
| my_checksum(data)                        |
+------------------------------------------+
| 5f683ea3674e33ce24bff5f68f53509566ad4da2 |
+------------------------------------------+
1 row in set (0.001 sec)
MariaDB [test]> delete from t2;
Query OK, 3 rows affected (0.011 sec)
MariaDB [test]> insert into t2 values ('hello'), ('world'), ('!');
Query OK, 3 rows affected (0.012 sec)
Records: 3  Duplicates: 0  Warnings: 0
MariaDB [test]> select my_checksum(data) from t2;
+------------------------------------------+
| my_checksum(data)                        |
+------------------------------------------+
| 7f6fb9a61c2097f70a36254c332c47364c496e07 |
+------------------------------------------+
1 row in set (0.001 sec)

当然,这依赖于列的SHA1在所有数据库中都是相同的。转换成字符串应该使其基本兼容,但在不同的数据库中实现这些转换的方式可能会有所不同。

percona工具包提供了您需要的工具。

https://docs.percona.com/percona-toolkit/

参见pt-table-checksumpt-table-sync

我找到了。

它非常简单而且非常快速。

CHECKSUM TABLE tbl_name

会给你一个数字值进行比较。

它是Transact-SQL,因此有望在MS Access、MySQL和MariaDB 上同样工作

相关内容

最新更新