2012-02-28 199 views
0

問題詳情。假設我們有一些InnoDB表,並且這個表包含一些記錄。 我的問題是:如何實現「刪除」操作,記住某種形式的操作日誌記錄?我引用「刪除」是因爲它有一些風格:MySQL從表或更新表列刪除標記爲已刪除?

  1. 刪除操作應使用DELETE FROM table_x WHERE...。這對於外鍵約束很有效。但是,如何跟蹤這一行動呢? (我的意思是某種形式的數據庫記錄操作)。如果刪除的記錄插入到輔助數據庫中,或者同一數據庫中的不同表格會是一個好主意?
  2. 另一個想法是有一個列,比如說valid可能的值爲1(對於活動/有效)和0(對於刪除的記錄)。 「刪除」操作將簡單地將此列上的值設置爲0,業務邏輯不再考慮它。記錄將通過保存所有記錄在相同的數據庫上完成。這種方法必須大量使用觸發器來執行其他任務,例如根據外鍵更新另一個表中的記錄。

如果您有這些任務,可以隨意添加其他方法來完成此任務。 另外,如果我們決定變體1)效果最好,是否可以在同一個事務中(從java代碼開始)執行DELETE FROM database1.tableINSERT into database2.table? (我真的沒有嘗試過,但我不認爲它會起作用)。我只是不想結束從第一個數據庫中刪除的行並從第二個行中丟失行。如果不可能,但仍然是1)最佳選擇,通過刪除table1中的記錄並將它們插入到同一事務中的table2中,將數據從table1移動到table2是一種很好的做法嗎?

請記住MySQL服務器內置的檢查可以保持數據庫的完整性,並且解決方案在回答我的問題/提出解決方案時也必須解決日誌記錄問題。

+0

我personnaly去與有效/刪除列,將允許你做一些行「待定」,如果稍後需要。 – 2012-02-28 18:52:40

+0

我們在談論什麼樣的數據?如果將數據移入存檔,您的公司將從數據挖掘中獲益嗎? – 2012-02-28 20:55:51

回答

1

我更喜歡第一種方法,它可以幫助你參考integrities和......,你可以在基表中的觸發器處理它,所以一切都發生在同一個事務

0

一般來說,我覺得fisical消除的記錄從來都不是一個好主意。

「邏輯」消除像標記記錄爲無效將是最好的主意。事實上,在「現實世界」中,大型數據庫和重要數據庫的記錄永遠不會被刪除。我更喜歡第二種方法,因爲您可以跟蹤所有數據庫操作。

+0

感謝您的回覆。我仍然不知道如何在這種情況下使用ON UPDATE限制語句,將有效列從1更改爲0.任何想法? – hypercube 2012-02-28 20:16:51

+0

不容易回答你的問題,因爲我不知道數據庫結構。我認爲將RESTRICT改爲CASCADE可能很有用,因爲例如在table1中的isValidField記錄也將在table2中更改,如果存在 – Franky 2012-02-28 20:25:30