mysql - 从 mysql 的校验和表中选择并仅返回校验和(而不是表)

标签 mysql checksum

当我运行“mysql> CHECKSUM TABLE mytable;”时,我得到以下结果:

+------------------+------------+
| Table            | Checksum   |
+------------------+------------+
| mydb.mytable     | 1679935596 |
+------------------+------------+

如何在一条 mysql 语句中选择并仅返回上述结果中的校验和(而不是表)? 像“SELECT Checksum FROM (CHECKSUM TABLE mytable);”之类的东西???试了好几次了,还是不行。

我想要的是:

+------------+
| Checksum   |
+------------+
| 1679935596 |
+------------+

最佳答案

您可以按列或列的总和来执行此操作。下面是在我的 table 上进行的测试。

SELECT sum(crc32(email)) as crc from users;
+-------------+
| crc         |
+-------------+
| 10679459550 |
+-------------+


select sum(crc32(concat(user_id,first_name,last_name,email,reportingManager))) as crc from users;
+------------+
| crc        |
+------------+
| 7196315383 |
+------------+

编辑

在传递数据库名称和表名称的存储过程中,下面将返回 crc。它会转到特殊的 INFORMATION_SCHEMA 数据库来为您检索列名称,并使用所有这些列和值来生成校验和。

存储过程:

drop procedure if exists getTableCRC32;
DELIMITER $$
create procedure getTableCRC32
(   dbname varchar(80),
    tableName varchar(80)
)
BEGIN
    set @sql1="select GROUP_CONCAT(`column_name` SEPARATOR ',') into @colNames";
    set @sql1=concat(@sql1," FROM `INFORMATION_SCHEMA`.`COLUMNS`");
    set @sql1=concat(@sql1," WHERE `TABLE_SCHEMA`='",dbName,"'");
    set @sql1=concat(@sql1," AND `TABLE_NAME`='",tableName,"'");
    -- select @sql1;
    PREPARE stmt1 FROM @sql1;
    EXECUTE stmt1;
    DEALLOCATE PREPARE stmt1;
    -- select @colNames;
    set @sql2=concat( 'select sum(crc32(concat(',  @colNames, '))) as crc from ',tableName);
    -- select @sql2;
    PREPARE stmt2 FROM @sql2;
    EXECUTE stmt2;
    DEALLOCATE PREPARE stmt2;
END
$$
DELIMITER ;

测试一下:

call getTableCRC32('so_gibberish','users');
+------------+
| crc        |
+------------+
| 7196315383 |
+------------+
call getTableCRC32('so_gibberish','fish');
+------------+
| crc        |
+------------+
| 3273020843 |
+------------+

Manual page for crc32

关于mysql - 从 mysql 的校验和表中选择并仅返回校验和(而不是表),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33897469/

相关文章:

java - 校验和检测变化

MySQL 触发器强制执行约束

php - Android 无法正确连接 MySQL 数据库

checksum - 我怎么能猜到校验和算法?

svn - 颠覆校验和算法

java - CRC-16 与 0xA001 多项式

c++ - C++ 中的 CRC-16 (IBM) 反向查找

mysql - 从关联表中选择行数而不进行子选择

mysql - 特定mysql查询的性能优化?

php - MySql - 不同服务器中表的大小写敏感问题