Rumah > pangkalan data > tutorial mysql > Bagaimanakah Saya Boleh Menjejaki Perubahan Rekod dalam MySQL Menggunakan Jadual Sejarah dan Pencetus?

Bagaimanakah Saya Boleh Menjejaki Perubahan Rekod dalam MySQL Menggunakan Jadual Sejarah dan Pencetus?

DDD
Lepaskan: 2024-12-15 00:45:14
asal
308 orang telah melayarinya

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

Menjejaki Perubahan Rekod dalam MySQL Menggunakan Jadual Sejarah dan Pencetus

MySQL menyediakan beberapa pilihan untuk menjejaki perubahan yang dibuat pada rekod dalam pangkalan data. Satu pendekatan yang berkesan ialah mencipta jadual sejarah untuk setiap jadual data sasaran. Jadual sejarah ini akan menyimpan semua operasi sisipan, kemas kini dan pemadaman yang dilakukan pada setiap baris dalam jadual asal.

Mencipta Jadual Sejarah

Untuk mencipta jadual sejarah, anda boleh menggunakan pertanyaan SQL berikut, menggantikan 'MyDB.data' dengan nama jadual data yang anda ingin jejak dan 'primary_key_column' dengan nama utamanya lajur kunci:

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);
Salin selepas log masuk

Menggunakan Pencetus untuk Menangkap Perubahan

Selepas mencipta jadual sejarah, anda boleh menyediakan pencetus untuk log perubahan secara automatik ke jadual data asal. Untuk operasi memasukkan, mengemas kini dan memadam, pencetus berikut boleh digunakan:

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;
Salin selepas log masuk

Contoh Jadual Sejarah

Jadual sejarah akan menangkap semua perubahan yang dibuat pada jadual data asal. Contohnya, diberikan jadual data dengan lajur 'ID' sebagai kunci utama, entri jadual sejarah berikut mungkin dihasilkan:

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 
Salin selepas log masuk

Melihat Perubahan

Untuk melihat perubahan yang dibuat pada lajur tertentu, anda boleh menyertai jadual sejarah dengan dirinya sendiri pada kunci utama dan lajur semakan dan menggunakan pernyataan SQL yang sesuai untuk membandingkan sebelumnya dan semasa. nilai.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menjejaki Perubahan Rekod dalam MySQL Menggunakan Jadual Sejarah dan Pencetus?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan