MYSQL 中的校验和选项分配给每个字段

Checksum option in MYSQL to assign to each field

我看过使用 crc 的示例,但我已经想到的示例是为整个 table 数据生成校验和(用于复制和数据验证)。例如:

SELECT  crc
FROM
(
  SELECT @r := MD5(CONCAT(property_id, asking_price, postcode, 
address_city, @r)) AS crc,
     @c := @c + 1 AS cnt
  FROM
(
SELECT @r := '', @c := 0
) rc,
(
SELECT property_id, asking_price, postcode, address_city
FROM table
WHERE property_type_id = 2
AND listing_type = 'BUY'
ORDER BY
  address_postalcode
) k
) ci
WHERE cnt = @c

我正在尝试根据一系列字段值(如上所示)为 MYSQL 数据库中的每个条目分配一个校验和值。这个想法是,当一组特定的字段具有相同的数据时,生成的校验和将是相同的,我可以通过检查校验和值来处理重复条目,而不是对字段进行冗长的检查以查看它们是否包含匹配数据.我在 SQL SERVER 中看到过这个,使用 checksum_binary,速度非常快,但是是否有更好的解决方案将校验和值应用于各个字段以进行比较,或者我应该坚持尝试修改以上内容?

我不明白你为什么要做这么复杂的事情:

每行 3 列的校验和:

SELECT id, MD5(concat(COALESCE(col1, "0"), COALESCE(col2, "0"), COALESCE(col3, "0"))) 
AS md5_checksum FROM tbl_name;

要插入这个新的校验和: 更改 table 以添加新列,然后

UPDATE into table_name t1,
(SELECT id, MD5(concat(COALESCE(col1, "0"), COALESCE(col2, "0"), COALESCE(col3, "0"))) 
    AS md5_checksum FROM tbl_name) t2
SET t1.mynewchecksum = t2.md5_checksum
WHERE t1.id = t2.id

请注意,校验和不会 100% 安全,就好像 1 列的最后一个字符不存在,但在下一列中发现哈希将相同。也许您可以在 concat 中添加一个分隔符以确保:

UPDATE into table_name t1,
    (SELECT id,
     MD5(concat_ws("-",COALESCE(col1, "0"), COALESCE(col2, "0"), COALESCE(col3, "0"))) 
        AS md5_checksum FROM tbl_name) t2
SET t1.mynewchecksum = t2.md5_checksum
WHERE t1.id = t2.id