Select 和 return 只有 mysql 中校验和 table 的校验和(不是 Table)
Select and return only Checksum (not Table) from checksum table in mysql
当我运行"mysql> CHECKSUM TABLE mytable;"时,我得到了以下结果:
+------------------+------------+
| Table | Checksum |
+------------------+------------+
| mydb.mytable | 1679935596 |
+------------------+------------+
如何select和return只有上面的校验和(不是Table)导致一个mysql语句?
像 "SELECT Checksum FROM (CHECKSUM TABLE mytable);" 这样的东西???试了好几次,还是不行。
我想要的是:
+------------+
| Checksum |
+------------+
| 1679935596 |
+------------+
MySQL CHECKSUM TABLE
命令对 table 中的每一行执行 CRC-32 校验和,包括行元数据。每行之前有一个或多个字节的元数据。我只是碰巧知道,在这种情况下,这一行有一个字节,它将包含数字 253,或十六进制的 0xFD。所以你可以使用下面的函数:
SELECT CRC32(CONCAT(0xFD, 'mytable')) AS Checksum;
您可以按列或列的总和来完成。下面是对我的 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 |
+------------+
编辑
在传递数据库名称和 table 名称的存储过程中,下面将 return 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 |
+------------+
当我运行"mysql> CHECKSUM TABLE mytable;"时,我得到了以下结果:
+------------------+------------+
| Table | Checksum |
+------------------+------------+
| mydb.mytable | 1679935596 |
+------------------+------------+
如何select和return只有上面的校验和(不是Table)导致一个mysql语句? 像 "SELECT Checksum FROM (CHECKSUM TABLE mytable);" 这样的东西???试了好几次,还是不行。
我想要的是:
+------------+
| Checksum |
+------------+
| 1679935596 |
+------------+
MySQL CHECKSUM TABLE
命令对 table 中的每一行执行 CRC-32 校验和,包括行元数据。每行之前有一个或多个字节的元数据。我只是碰巧知道,在这种情况下,这一行有一个字节,它将包含数字 253,或十六进制的 0xFD。所以你可以使用下面的函数:
SELECT CRC32(CONCAT(0xFD, 'mytable')) AS Checksum;
您可以按列或列的总和来完成。下面是对我的 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 |
+------------+
编辑
在传递数据库名称和 table 名称的存储过程中,下面将 return 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 |
+------------+