首頁 >資料庫 >mysql教程 >如何使用歷史表和觸發器來追蹤 MySQL 中的記錄變更?

如何使用歷史表和觸發器來追蹤 MySQL 中的記錄變更?

DDD
DDD原創
2024-12-15 00:45:14312瀏覽

How Can I Track Record Changes in MySQL Using History Tables and Triggers?

使用歷史表和觸發器追蹤MySQL 中的記錄變更

MySQL 提供了多個選項來追蹤資料庫中的記錄做的更改。一種有效的方法是為每個目標資料表建立一個歷史表。此歷史表將儲存對原始表中每一行執行的所有插入、更新和刪除操作。

建立歷史表

要建立歷史表,您可以使用下列 SQL查詢,將「MyDB.data」替換為要追蹤的資料表的名稱,將「primary_key_column」替換為其主鍵的名稱列:

CREATE TABLE MyDB.data_history LIKE MyDB.data;

ALTER TABLE MyDB.data_history MODIFY COLUMN primary_key_column int(11) NOT NULL,
DROP PRIMARY KEY, ENGINE = MyISAM, ADD action VARCHAR(8) DEFAULT 'insert' FIRST,
ADD revision INT(6) NOT NULL AUTO_INCREMENT AFTER action,
ADD dt_datetime DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP AFTER revision,
ADD PRIMARY KEY (primary_key_column, revision);

使用觸發器擷取變更

建立歷史表後,您可以設定觸發器以自動將變更記錄到原始資料表中。對於插入、更新和刪除操作,可以使用下列觸發器:

CREATE TRIGGER MyDB.data__ai AFTER INSERT ON MyDB.data FOR EACH ROW
INSERT INTO MyDB.data_history SELECT 'insert', NULL, NOW(), d.*
FROM MyDB.data AS d WHERE d.primary_key_column = NEW.primary_key_column;

CREATE TRIGGER MyDB.data__au AFTER UPDATE ON MyDB.data FOR EACH ROW
INSERT INTO MyDB.data_history SELECT 'update', NULL, NOW(), d.*
FROM MyDB.data AS d WHERE d.primary_key_column = NEW.primary_key_column;

CREATE TRIGGER MyDB.data__bd BEFORE DELETE ON MyDB.data FOR EACH ROW
INSERT INTO MyDB.data_history SELECT 'delete', NULL, NOW(), d.*
FROM MyDB.data AS d WHERE d.primary_key_column = OLD.primary_key_column;

範例歷史表

歷史表將擷取對原始資料表。例如,給定一個以「ID」列為主鍵的資料表,可能會產生以下歷史表條目:

ID    revision   action    data columns..
1     1         'insert'   ....          initial entry for row where ID = 1
1     2         'update'   ....          changes made to row where ID = 1
2     1         'insert'   ....          initial entry, ID = 2
3     1         'insert'   ....          initial entry, ID = 3 
1     3         'update'   ....          more changes made to row where ID = 1
3     2         'update'   ....          changes made to row where ID = 3
2     2         'delete'   ....          deletion of row where ID = 2 

查看更改

要查看對特定列所做的更改,您可以在主鍵和修訂列上將歷史表與其自身連接,並使用適當的SQL 語句來比較先前的值和目前的值。

以上是如何使用歷史表和觸發器來追蹤 MySQL 中的記錄變更?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn