我正在使用MariaDB 10.5创建一个触发器来管理MariaDB表中的版本控制。
当插入新行时,没有什么特别的事情要做。当更新一行时,我想获得以下效果:
latest
列在旧行上更新为false
latest
设置为true
,而old_id
设置为旧行的id
受约束于id
,latest
和old_id
以外的其他列的名称是未知的。
(我知道对版本表有更好的策略-这是一个练习。)
我想到了这个
-- the table
create table cast11_ricette
(
id int auto_increment key,
latest tinyint(1) default 1 not null,
old_id int null,
f1 int null, int null, ...
);
-- the trigger
delimiter |
CREATE TRIGGER versioning BEFORE UPDATE ON tbl
FOR EACH ROW
BEGIN
SET NEW.id = NULL;
SET NEW.old_id = OLD.id;
INSERT INTO tbl SELECT NEW;
-- SET NEW = OLD; -- this does not work!
SET NEW.latest = false;
END;
|
delimiter ;
除了不更新旧行,这可以实现所有所需的效果。我考虑的方法是:
NEW
中的所有列设置为OLD
中的值-可以,但是不满足约束条件NEW
中的所有列设置为OLD
中的值-丑陋! update
s结果的应用程序。这些方法都不是完全令人满意的。