我想要一个触发器来对插入的记录执行以下操作:
# pseudocode
if new.group_id is null
set new.group_id = new.id
else
# don't touch it
end
更清楚地说:假设我有一张包含三列的表:id
首要的关键,group_id
int, 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 MyTable
FOR EACH ROW BEGIN
SET NEW.group_id = COALESCE(NEW.group_id, NEW.id);
END
然而,有一个问题。在里面BEFORE INSERT
阶段,自动生成id
价值还没有产生。因此,如果group_id
为空,默认为NEW.id
始终为 0。
但是如果你改变这个触发器在AFTER INSERT
阶段,因此您可以访问生成的值NEW.id
,您无法修改列值。
MySQL 不支持以下表达式DEFAULT
列的,因此您也不能在表定义中声明此行为。 *更新:MySQL 8.0.13 支持DEFAULT (<expression>)
但表达式仍然不能依赖于自动增量值(这是有记录的 https://dev.mysql.com/doc/refman/8.0/en/data-type-defaults.html).
唯一的解决办法是做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();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)