我想有一个触发执行以下为插入的记录操作:
# 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
是否有可能与触发器? (我知道插入,但有触发的还要好后我可以更新记录。)
Answer 1:
我不知道任何方式在一个声明中这样做,即使使用触发器。
触发的解决方案,@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
为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();
Answer 2:
我回答在这里,作为公认的答案比尔Karwin规定:
在BEFORE INSERT阶段,尚未产生值自动生成的ID。 所以,如果GROUP_ID为null,则默认为NEW.id这始终是0。
我有它的答案-为OP(和前来参观者),这里有几个要点:您无法更新从该触发被调用,因为你会得到错误1442表:
Error Code: 1442
Can't update table 'MyTable' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
1.to更新新行使用BEFORE INSERT ON
触发,这样你可以更新为新行,这可以通过新的运营商即可以访问所有字段
set NEW.group_id = NEW.id
插入之前2.注册AUTO_INCREMENT值 :
SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='MyTable'
总结起来 - 为“触发SQL d是东西如下:
DELIMITER //
DROP TRIGGER IF EXISTS MyTrigger//
CREATE TRIGGER MyTrigger BEFORE INSERT ON MyTable
FOR EACH ROW BEGIN
IF new.group_id IS NULL
set @auto_id := (SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME='MyTable' AND TABLE_SCHEMA=DATABASE() );
set NEW.group_id = @auto_id;
ENF IF;
END;
//
DELIMITER ;
Answer 3:
这对我的作品
DELIMITER $$
CREATE TRIGGER `myTriggerNameHere`
BEFORE INSERT ON `table` FOR EACH ROW
BEGIN
SET NEW.group_id = IF(NEW.group_id IS NULL, LAST_INSERT_ID()+1, NEW.group_id);
END;
$$
DELIMITER ;
Answer 4:
我相信,这会为你工作
我有两个表
test_b: a_id, value
test_c: a_id, value
这里是测试B的插入的触发器。 它检查是否A_ID为空,如果是将其插入0
CREATE TRIGGER test_b AFTER INSERT ON test_b
FOR EACH ROW
INSERT INTO test_c (a_id, value) VALUES (IFNULL(NEW.a_id, 0),NEW.value)
Answer 5:
这触发应该做你的要求。
CREATE TRIGGER mytrigger BEFORE INSERT ON mytable
IF new.group_id IS NULL
SET new.group_id = new.id
END IF
END;
它是从一个非常类似的例子复制MySQL文档页面。
Answer 6:
触发好像在这种情况下矫枉过正。 简单应用默认。
CREATE TABLE `test` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`value` varchar(100) NOT NULL,
`group_id` TINYINT(3) UNSIGNED NOT NULL DEFAULT '2'
)
文章来源: MySQL trigger to update a field to the value of id