日期:2014-05-16  浏览次数:20838 次

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
有办法吗?
谢谢了