2012-03-28 96 views
0

我有一個現有的應用程序(與MySQL數據庫)。MySql軟刪除

我剛剛得到一個新的要求,我需要刪除一些主要實體的記錄。我不想在這裏申請硬刪除作爲整個應用程序的風險。如果我使用軟刪除,我必須添加另一個字段is_deleted,因此我必須更新我所有的查詢(如where is_deleted ='0')。

請讓我知道是否有更聰明的方式來處理這種情況。如果我引入一個新的標誌來處理刪除,我必須對一半的查詢進行更改。

+1

沒有其他辦法 - 無論是一個新的標誌和/或可以擴展現有的標誌...... – Yahia 2012-03-28 06:03:07

+0

是,按照您的要求標記是最好的選擇,othervise你可以把你的表的抽象成臨時表並完成刪除它的檢查。 – 2012-03-28 06:04:54

+0

取決於軟刪除的含義以及應用程序的風險。您可以爲「已刪除」條目創建一個新表,並將「軟刪除」移到整個表中。 – liquorvicar 2012-03-28 06:05:47

回答

5

您的應用程序無需任何更改即可運行。 MySQL是ANSI-SPARC Architecture兼容。隨着外部模式您實現codd's rule 9 "Logical data independence"

變化到邏輯電平(表,列,行等)必須 不需要改變結構的基礎上的應用程序。邏輯 數據獨立性比物理數據難以實現獨立性。

您可以rename您的表,並創建與原始表名稱的意見。樣本:

讓我們supose一個名爲my_data表:

REMAME TABLE my_data TO my_data_flagged 

ALTER TABLE my_data_flagged 
    ADD COLUMN is_deleted boolean NOT NULL default 0; 

CREATE VIEW my_data AS 
    SELECT * 
    FROM my_data_flagged 
    WHERE is_deleted = '0' 

另一種方法是創建一個觸發器,使刪除行的副本中的獨立表。

4

四點建議:

  1. 而不是使用一個名爲位的is_deleted,使用日期時間稱爲像deleted_Date ...這個值是NULL,如果它仍處於活動狀態,並且是刪除時間戳否則日期。這種方式你也知道一個特定的記錄被刪除。

  2. 而不是更新一半的查詢來排除已刪除的記錄,創建一個視圖來執行此篩選,然後更新您的查詢以使用此視圖而不是在任何地方應用篩選。

  3. 如果軟刪除的記錄涉及任何類型的關係,則可能必須創建觸發器以確保活動記錄不能有被標記爲已刪除的父項。

  4. 請考慮您希望如何最終硬刪除這些軟刪除的記錄,並確保在執行硬刪除之前進行適當的完整性檢查。