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

时间:2018-02-22 16:05:48

标签: mysql duplicates checksum

我已经看过使用crc的示例,但是我已经完成了自己的工作,为整个表数据生成校验和(用于复制和数据验证)。例如:

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,这是如此之快,但是有更好的解决方案将校验和值应用于各个字段进行比较,还是应该坚持尝试修改上述内容?

1 个答案:

答案 0 :(得分:0)

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

每行有3列的校验和:

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

要插入此新校验和: 更改表格以添加新列

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
相关问题