Skip to content

Instantly share code, notes, and snippets.

@rksk
Last active October 30, 2023 10:07
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save rksk/908a7edfa6f735183448aeecedfd65ef to your computer and use it in GitHub Desktop.
Save rksk/908a7edfa6f735183448aeecedfd65ef to your computer and use it in GitHub Desktop.
MySQL: Logging table changes into another table using triggers
This is related to the blog post: https://medium.com/p/5215c77083e5
CREATE TABLE data (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
timestamp TIMESTAMP,
data1 VARCHAR(255) NOT NULL,
data2 DECIMAL(5,2) NOT NULL
);
CREATE TABLE data_log (
action VARCHAR(255),
action_time TIMESTAMP NULL DEFAULT NULL,
id INT,
timestamp TIMESTAMP NULL DEFAULT NULL,
data1 VARCHAR(255) NULL,
data2 DECIMAL(5,2) NULL
);
DROP TRIGGER IF EXISTS ai_data;
DELIMITER $$
CREATE TRIGGER ai_data AFTER INSERT ON data
FOR EACH ROW
BEGIN
INSERT INTO data_log (action, action_time, id, timestamp, data1, data2)
VALUES('insert', NOW(), NEW.id, NEW.timestamp, NEW.data1, NEW.data2);
END$$
DELIMITER ;
DROP TRIGGER IF EXISTS au_data;
DELIMITER $$
CREATE TRIGGER au_data AFTER UPDATE ON data
FOR EACH ROW
BEGIN
INSERT INTO data_log (action, action_time, id, timestamp, data1, data2)
VALUES('update', NOW(), NEW.id, NEW.timestamp, NEW.data1, NEW.data2);
END$$
DELIMITER ;
DROP TRIGGER IF EXISTS ad_data;
DELIMITER $$
CREATE TRIGGER ad_data AFTER DELETE ON data
FOR EACH ROW
BEGIN
INSERT INTO data_log (action, action_time, id, timestamp, data1, data2)
VALUES('delete',NOW(), OLD.id, OLD.timestamp, OLD.data1, OLD.data2);
END$$
DELIMITER ;
INSERT INTO data (timestamp, data1, data2)
VALUES ('2018-10-03 15:23:54', 'some text', 45.28);
UPDATE data
SET data1 = 'updated value'
WHERE data2 = 45.28;
DELETE FROM data
WHERE data1 = 'updated value';
SELECT * FROM data_log;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment