gpt4 book ai didi

MySQL触发器更新一个字段为id的值

转载 作者:IT老高 更新时间:2023-10-28 23:57:43 26 4
gpt4 key购买 nike

我想要一个触发器来对插入的记录执行以下操作:

 # 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值(value)还没有产生。所以如果group_id为空,默认为 NEW.id始终为 0。

但是如果您将此触发器更改为在 AFTER INSERT 期间触发阶段,因此您可以访问 NEW.id 的生成值,您不能修改列值。

MySQL 不支持 DEFAULT 的表达式列,因此您也不能在表定义中声明此行为。 *更新:MySQL 8.0.13 支持 DEFAULT (<expression>)但表达式仍然不能依赖于自动增量值(这是 documented )。

唯一的解决办法是执行 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的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1211792/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com