2009-11-23 112 views
6

我知道有兩種方法可以從數據庫中刪除表中的數據如何從數據庫中刪除?

  • 刪除它永遠
  • 使用標誌像isActive /請將isDeleted

現在用isActive的問題是,我必須跟蹤無論在我的SQL查詢中,無論記錄是否處於活動狀態。然而,使用DELETE將永遠擺脫數據。

什麼是最好的備份方式?

假設我在數據庫中有多個表,我是否應該有一個通用函數,它將所有內容都備份並存儲在另一個表中(可能是XML?或者還有其他方法)。

我正在使用MySQL,但也很好奇其他數據庫中使用的技術。

+2

如果您告訴我們您正在使用的數據庫軟件,則可能會給您提供代碼片段:) – tloach 2009-11-23 17:54:11

+0

使用MySQL。不是其他人嗎? :P – Abhinav 2009-11-23 18:07:42

回答

13

用隱藏非活動項目的視圖替換表格。

或者在DELETE上寫一個觸發器,將行備份到一個存檔表。

0

您可以在DELETED列分區表和定義將包括病情的看法:

… AND deleted = 0 

這將使查詢在活動數據一樣簡單和高效。

+0

abhinav想要刪除行......所以需要進行水平分區。 – reinierpost 2009-11-23 17:51:48

+0

分區和使用視圖(在'SQL Server'和'Oracle'中)將使查詢完全像從表中物理刪除行一樣。要處理刪除的(或彙總的)數據,您可以始終直接對錶進行較簡單的查詢。 – Quassnoi 2009-11-23 17:54:14

2

您可以使用觸發器在刪除記錄時觸發,將它們備份到某種墓地表中。

0

那麼,如果您使用的是SqlServer,則可以使用觸發器,這將允許您將記錄移動到已刪除的表中。

+1

SQL Server不是唯一具有觸發器功能的數據庫,但它有助於瞭解Abhinav是否正在使用支持觸發器的RDBMS。其他我可以想到的是MySQL,Oracle,Progress OpenEdge,或許還有其他的。 – ssakl 2009-11-23 18:08:55

+0

我有MySQL 4.1.25。這會在那裏工作嗎? – Abhinav 2009-11-23 18:27:27

+0

如果該版本有觸發器,那麼是的,它應該。對不起,我使用Sql Server,所以我不確定你使用的版本。 – 2009-11-23 18:29:21

2

您可以使用isDeleted列並定義一個視圖,該視圖選擇除isDeleted條件爲isDeleted = false之外的所有列。然後讓所有的stps只與視圖一起工作。

1

你可以保持一個歷史表,在那裏你回記錄了和時間戳

1

一對刪除數據是,它可能需要一個關係的最大原因 - 例如用戶可能會決定從數據庫中刪除一位老客戶,但您仍然需要客戶記錄,因爲它是由舊發票引用的(這可能會延長使用壽命)。

在此基礎上最佳的解決方案往往是「請將isDeleted」類型的列,以期聯合(Quassnoi提到分區,可與性能問題的幫助,可能彈出由於很多無形的數據)。