来源: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-checksum
和pt-table-sync
我找到了。
它非常简单而且非常快速。
CHECKSUM TABLE tbl_name
会给你一个数字值进行比较。
它是Transact-SQL,因此有望在MS Access、MySQL和MariaDB 上同样工作