2016-02-04 37 views
1

是否有可能在一个表中选择整行,并得到某种校验的?我正在寻找一种方法来告诉我的代码只有在至少有一条记录被更改时才更新数据。从数据更改跟踪的角度来看,它将帮助我缩小历史表中记录的一些更改的大小。 - 谢谢。MySQL的行校验

+0

我们如何知道记录是否被更改? – sagi

+0

一种方式是:你必须在一些地方保存上一个记录,并与最新的数据库 – Monty

+0

检查它做更新。然后使用'$ pdo-> rowCount()'或'mysqli_affected_rows()'查看是否更新了任何行。如果不是,请不要更新历史记录表。 – Barmar

回答

0

是的,你可以使用所提到的代码

SELECT ROW_COUNT(); 

,然后使用类似的条件,如果ROW_COUNT()> 1,则您可以处理数据 希望工程

+0

他并不试图找出他的更新是否改变了任何内容,他想知道在他进行更新之前他的新数据是否与旧数据不同。 – Barmar

+0

好吧,我误解了 –

+0

其实,这可能是正确的答案。做'UPDATE',看'ROW_COUNT()> 0'。如果不是,请不要更新历史记录表。 – Barmar

3

您可以组合MD5()CONCAT()函数来产生用于行MD5校验:

SELECT MD5(CONCAT(col1, col2, col3, ...)) as MD5_checksum FROM table; 

如果所述一个列可空,要确保你把它包在IFNULL(col, ''),为空会使CONCAT()也是空的结果。

另外请注意,这不是100%保存。如果你从一列删除1个字符并将其添加为下一列的第一个字符时,CONCAT()的结果,因此MD5哈希的将是相同的。

1

您可以通过比较旧的校验和值和当前校验和来检查更改。

CHECKSUM TABLE tbl_name 
+0

良好的通话。这只适用于整个表格而不是单一记录,但如果这是您所需要的,那么最有可能的就是这样。 :) – Ivar

+0

注意;如果您在大型表格(百万条记录)上执行得非常频繁,那么此操作可能会很慢。 – Hariboo

0

扩展Ivars答案以获得更健壮的MD5校验和列;

如果连接一个NULL字段,你将不会得到任何结果。如果它的NULL将字段替换为字母'A'。

SELEECT MD5(concat(IFNULL(col1, "A"), IFNULL(col2, "A"), IFNULL(col3, "A"))) 
AS md5_checksum FROM tbl_name; 
+1

看到您的评论,并相应地更新了我的答案。感谢您的高举。 :) – Ivar

+0

没有probs,感谢这一开始。 – Hariboo