表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
 
 这是怎么回事,当然删掉这个触发器是可以正常插入的,但我需要这样一个东东啊

解决方案 »

  1.   

    在源表上建的触发器代码中不能再次修改源表,否则触发器的更新操作再次触发了触发器的操作,在触发器中造成死循环。
    从你的代码中发现你希望将新增记录的cr赋值为1。你可以这样处理:
    CREATE TRIGGER ntt_cr BEFORE INSERT
    ON ntt FOR EACH ROW 
    BEGIN
    SET NEW.cr = 1;
    END;
      

  2.   

    通常只有在同时修改其他的表(比如主丛表,汇总统计表等等),或者改变当前记录的部分字段内容(比如说是记录最后修改时间)的情况下推荐使用触发器。
    如果需要修改源表的其他记录,建议另外执行单独的SQL语句或者执行存储过程的方式进行处理。
      

  3.   

    哈哈,幸亏你碰到我了.给你个我的:
    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
      

  4.   

    非常感谢isoftk  ,另外确实如最后2人所说,"楼主写的语句好像要更新的行并不是当前的触发行。
    楼上两位的语句更新的都是当前触发行的列。"isoftk 好人,能帮我再看看吗我是要把no字段等于新插入字段的no_no的那行的cr改为1
    有办法吗?
    谢谢了
      

  5.   

    也就是说那个WHERE语句几乎是必须有的,当然也可能是我菜,不知道其他的办法