MYSQL触发器问题,这已经是第5次问了,前4次都石沉大海...
表ntt里有no,no_no,cr这3个字段,no字段是个auto_increment列,我写了个这样的触发器.
CREATE TRIGGER ntt_cr BEFORE INSERT
ON ntt FOR EACH ROW BEGIN
UPDATE ntt SET cr=1 WHERE no=NEW.no_no;
END
那个替换;用的DELIMITER |我当然也加了
但现在我如果执行INSERT语句,就会出如下错误
Can 't update table 'ntt ' in stored function/trigger because it is already used by statement which invoked this stored function/trigger
这是怎么回事,当然删掉这个触发器是可以正常插入的,但我需要这样一个东东啊
------解决方案--------------------在源表上建的触发器代码中不能再次修改源表,否则触发器的更新操作再次触发了触发器的操作,在触发器中造成死循环。
从你的代码中发现你希望将新增记录的cr赋值为1。你可以这样处理:
CREATE TRIGGER ntt_cr BEFORE INSERT
ON ntt FOR EACH ROW
BEGIN
SET NEW.cr = 1;
END;
------解决方案--------------------哈哈,幸亏你碰到我了.给你个我的:
DELIMITER $$
DROP TRIGGER /*!50114 IF EXISTS */ `recordquery`.`T_sys_User_Add`$$
create trigger `recordquery`.`T_sys_User_Add` BEFORE INSERT on `recordquery`.`t_sys_user`
for each row BEGIN
DECLARE strQX varchar(200);
IF NEW.QX= ' ' THEN
set strQX=(select QX from T_sys_User where uid= 'admin ');
set strQX=(select replace(strQX, 'T ', 'F '));
SET NEW.QX=strQX;
SET NEW.QX_Assign=strQX;
END IF;
END;
$$
我当时也快被整死了,幸亏后来悟了.
根本不需要UPDATE,直接把你要插入的字段修改掉就行了
你的应该这样改
CREATE TRIGGER ntt_cr BEFORE INSERT
ON ntt FOR EACH ROW BEGIN
SET NEW.cr=1;
END
------解决方案--------------------看楼主写的语句好像要更新的行并不是当前的触发行。
楼上两位的语句更新的都是当前触发行的列。
------解决方案--------------------嘻嘻,回答问题的人看错了楼主的问题
------解决方案--------------------非常感谢isoftk ,另外确实如最后2人所说,
"楼主写的语句好像要更新的行并不是当前的触发行。
楼上两位的语句更新的都是当前触发行的列。 "
isoftk 好人,能帮我再看看吗
我是要把no字段等于新插入字段的no_no的那行的cr改为1
有办法吗?
谢谢了