By using db<>fiddle, you agree to license everything you submit by Creative Commons CC0.
CREATE TABLE IF NOT EXISTS `user` (
`user_id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL,
`address` VARCHAR(255) NULL,
`city` VARCHAR(45) NULL,
`phone` VARCHAR(45) NULL,
PRIMARY KEY (`user_id`)
) ENGINE = InnoDB DEFAULT CHARSET=utf8;
INSERT INTO user (name,address,city,phone) VALUES
('aaa','address1','city1','011-2222222'),
('bbb','address2','city2','011-3333333'),
('ccc','address3','city3','011-4444444'),
('ddd','address4','city4','011-5555555'),
('eee','address5','city5','011-6666666'),
('fff','address6','city6','011-7777777');
CREATE TABLE IF NOT EXISTS `user_log` (
`log_id` INT NOT NULL AUTO_INCREMENT,
`user_id` INT NOT NULL,
`action` TEXT NOT NULL,
`old_data` TEXT NOT NULL,
`new_data` TEXT NOT NULL,
`changed_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`view` ENUM('yes', 'no') NULL DEFAULT 'no',
PRIMARY KEY (`log_id`)
) ENGINE = InnoDB DEFAULT CHARSET=utf8;
select * from user;
user_id | name | address | city | phone |
---|---|---|---|---|
1 | aaa | address1 | city1 | 011-2222222 |
2 | bbb | address2 | city2 | 011-3333333 |
3 | ccc | address3 | city3 | 011-4444444 |
4 | ddd | address4 | city4 | 011-5555555 |
5 | eee | address5 | city5 | 011-6666666 |
6 | fff | address6 | city6 | 011-7777777 |
CREATE TRIGGER `user_log`
AFTER UPDATE ON `user`
FOR EACH ROW
BEGIN
INSERT INTO user_log (user_id,action,old_data,new_data)
SELECT NEW.user_id,
CONCAT('Changed ', OLD.name, "'s ", columnname),
oldvalue,
newvalue
FROM ( SELECT 'name' columnname, OLD.name oldvalue, NEW.name newvalue
UNION ALL
SELECT 'address', OLD.address, NEW.address
UNION ALL
SELECT 'city', OLD.city, NEW.city
UNION ALL
SELECT 'phone', OLD.phone, NEW.phone
) data
WHERE NOT oldvalue <=> newvalue;
END
UPDATE user SET name = 'ggg', address = 'address7' WHERE user_id = 1;
UPDATE user SET phone = '123-4567890', address = 'address8' WHERE user_id = 5;
SELECT * FROM user;
user_id | name | address | city | phone |
---|---|---|---|---|
1 | ggg | address7 | city1 | 011-2222222 |
2 | bbb | address2 | city2 | 011-3333333 |
3 | ccc | address3 | city3 | 011-4444444 |
4 | ddd | address4 | city4 | 011-5555555 |
5 | eee | address8 | city5 | 123-4567890 |
6 | fff | address6 | city6 | 011-7777777 |
SELECT * FROM user_log;
log_id | user_id | action | old_data | new_data | changed_date | view |
---|---|---|---|---|---|---|
1 | 1 | Changed aaa's name | aaa | ggg | 2022-06-22 11:12:43 | no |
2 | 1 | Changed aaa's address | address1 | address7 | 2022-06-22 11:12:43 | no |
4 | 5 | Changed eee's address | address5 | address8 | 2022-06-22 11:12:43 | no |
5 | 5 | Changed eee's phone | 011-6666666 | 123-4567890 | 2022-06-22 11:12:43 | no |