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