sze*_*ryf 17 mysql triggers insert
我想有一个触发器来执行插入记录的以下操作:
# pseudocode
if new.group_id is null
set new.group_id = new.id
else
# don't touch it
end
Run Code Online (Sandbox Code Playgroud)
更清楚地说:我有一个包含三列的表:idprimary key,group_idint,valuevarchar.
当我group_id像这样插入时:
INSERT INTO table(value, group_id) VALUES ('a', 10)
Run Code Online (Sandbox Code Playgroud)
我想:
id | group_id | value
---+----------+------
1 | 10 | a
Run Code Online (Sandbox Code Playgroud)
但是当我省略时group_id:
INSERT INTO table(value) VALUES ('b')
Run Code Online (Sandbox Code Playgroud)
它应该自动设置id为此记录的:
id | group_id | value
---+----------+------
2 | 2 | b
Run Code Online (Sandbox Code Playgroud)
是否可以使用触发器?(我知道我可以在插入后更新记录,但触发器会更好.)
Bil*_*win 29
即使使用触发器,我也不知道如何在一个语句中执行此操作.
@Lucky建议的触发器解决方案在MySQL中看起来像这样:
CREATE TRIGGER MyTrigger BEFORE INSERT ON MyTable
FOR EACH ROW BEGIN
SET NEW.group_id = COALESCE(NEW.group_id, NEW.id);
END
Run Code Online (Sandbox Code Playgroud)
但是,有一个问题.在该BEFORE INSERT阶段中,id尚未生成自动生成的值.因此,如果group_id为null,则默认NEW.id为始终为0.
但是,如果您在此AFTER INSERT阶段中将此触发器更改为触发,那么您可以访问生成的值NEW.id,则无法修改列值.
MySQL不支持DEFAULT列的表达式,因此您也不能在表定义中声明此行为.
唯一的解决方案是执行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();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
48027 次 |
| 最近记录: |