2016-02-04 91 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