Mysql

儲存已刪除行的最佳方法

  • August 7, 2017

我有一個表,其中包含使用者可以刪除的操作。

發生的情況是,我想將已刪除的行儲存一段時間,以作為恢復,以防任何客戶後悔刪除。

其中一列是 id_user,所以我有兩個想法:

  • 創建另一個與第一個相同的表來儲存已刪除的行(問題是保持它們相等,所以我必須記住對第二個進行的第一個中的任何更改);

要麼

  • 更新行設置id_user=-id_user,以便記錄未列出給該使用者,但它們仍然相關,如果需要,我可以恢復它們(問題是儲存不同的東西$$ valid and backup records $$在同一張表中);

最好的方法是什麼?

PS:這些記錄在我的應用程序中的很多地方都被呼叫,添加另一列意味著更改我的應用程序,這是毫無疑問的。如果這最終成為唯一的解決方案,我寧願不添加這個“災難恢復功能”。

我通常將其設置為觸發器並將更改儲存在單獨的表中。將 id_user 作為 FK 保留在表中,並輸入日期欄位以記錄更改的時間。即使您不知道確切的日期,您也可以按日期恢復。

我在 2012 年 3 月 5 日寫了這樣的文章(數據庫同步和軟刪除場景中的墓碑表與已刪除標誌

基本上,您可以執行以下操作:

  • 創建一個TINYINT名為的新列DELETED,預設值為0。當您打算刪除一行時,只需使用 更新該行DELETED=1。不要索引此列,因為基數太低。
  • 要取消刪除一行,您可以簡單地使用 更新該行DELETED=0

作為一種選擇,您可以創建一個包含所有已知已刪除的墓碑表user_ids

DROP TABLE IF EXISTS deleted_users;
CREATE TABLE deleted_users
SELECT DISTINCT id_user FROM myusers WHERE DELETED=1;
ALTER TABLE deleted_users ADD PRIMARY KEY (id_user);

然後,您可以按如下方式查詢刪除數據

SELECT * FROM myusers
WHERE DELETED=1;

要麼

SELECT B.* FROM
myusers A INNER JOIN deleted_users B
ON A.id_user = B.id_user;

要永久清除標記的已刪除數據,然後執行

DELETE FROM myusers
WHERE DELETED=1;

要麼

DELETE A.*,B.* FROM
myusers A INNER JOIN deleted_users B
ON A.id_user = B.id_user;
TRUNCATE TABLE deleted_users;

警告/免責聲明

請在嘗試之前備份您的數據。在 Dev/Staging 中進行實驗

引用自:https://dba.stackexchange.com/questions/182895