MySQL触发器将字段更新为id的值
我想要一个触发器来对插入的记录执行以下操作:
# pseudocode if new.group_id is null
set new.group_id = new.id
else
# don't touch it
end
更清楚的说:说我有一个包含三列的表:id
主键,group_id
整型,value
varchar。
当我这样插入时group_id
:
INSERT INTO table(value, group_id) VALUES ('a', 10)
我想拥有:
id | group_id | value---+----------+------
1 | 10 | a
但是当我省略时group_id
:
INSERT INTO table(value) VALUES ('b')
它应自动设置id
为此记录的:
id | group_id | value---+----------+------
2 | 2 | b
扳机有可能吗?(我知道插入后可以更新记录,但使用触发器会更好。)
回答:
我不知道任何方法可以在一个语句中执行此操作,即使使用触发器也是如此。
@Lucky建议的触发器解决方案在MySQL中如下所示:
CREATE TRIGGER MyTrigger BEFORE INSERT ON MyTableFOR EACH ROW BEGIN
SET NEW.group_id = COALESCE(NEW.group_id, NEW.id);
END
但是,有一个问题。在此BEFORE
INSERT阶段,id
尚未生成自动生成的值。因此,如果group_id
为null,则默认NEW.id
为始终为0。
但是,如果您在此AFTER INSERT
阶段将触发器更改为触发,那么您就可以访问的生成值NEW.id
,则无法修改列值。
MySQL不支持DEFAULT
列的表达式,因此您也不能在表定义中声明此行为。*更新:MySQL 8.0.13支持,DEFAULT
(<expression>)但表达式仍然不能依赖于自动增量值(已记录)。
唯一的解决方案是执行INSERT
,然后立即执行UPDATE
来更改group_id
未设置的。
INSERT INTO MyTable (group_id, value) VALUES (NULL, 'a');UPDATE MyTable SET group_id = COALESCE(group_id, id) WHERE id = LAST_INSERT_ID();
以上是 MySQL触发器将字段更新为id的值 的全部内容, 来源链接: utcz.com/qa/426495.html