mariadb 比较导入的数据库a-(是否可以进行指纹识别?)

ftf50wuq  于 2022-11-08  发布在  其他
关注(0)|答案(3)|浏览(119)

来源:Windows网络共用上的MS Access
目标:Ubuntu上的MySQL/MariaDB
工具:mdb导出、mysqlimport
记录计数:150万以上

我想知道是否有一种快速可靠的方法来比较导入的数据记录。
是否有一个SQL标准相当于文件的md5指纹哈希值?现在,我正在构建不同的导入例程,我只想快速检查相似性,如果失败,稍后搜索详细的差异。

i7uaboj4

i7uaboj41#

可以使用stored aggregate functions(应该是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。转换为字符串应该使其最兼容,但在不同的数据库中实现这些转换的方式可能会有差异。

9w11ddsr

9w11ddsr2#

percona工具包有您需要的工具。
https://docs.percona.com/percona-toolkit/
请参阅pt-table-checksumpt-table-sync

ccrfmcuu

ccrfmcuu3#

我找到了。
它非常简单,而且非常快。

CHECKSUM TABLE tbl_name

会给你一个数值来比较。
它是Transact-SQL,因此有望在MS Access、MySQL和MariaDB上运行相同的功能

相关问题