先建一个表,表结构如下:
CREATE TABLE  `seek`.`test` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `nid` int(10) unsigned NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;再为此表建立触发器,代码如下:CREATE TRIGGER testref BEFORE INSERT ON test
  FOR EACH ROW BEGIN
    UPDATE test SET nid = 0 WHERE id = NEW.nid;
  END即插入数据后,更改id值与新插入数据nid相等的数据。
当插入数据:
mysql> insert into test(id,nid) values (12,3);出现以下错误
ERROR 1442 (HY000): Can't update table 'test' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.请问如何解决??

解决方案 »

  1.   

    不能对正在插入的test表进行更新你刚插入的数据就改,
    为什么不一次性查对呢?
      

  2.   

    逻辑上你这么做是可以通过的,比如元原来的标有数据:
    id                   nid
    1                     3
    3                     6
    然后你插入(12,3)那么在这个记录插入之前会先把第二条记录修改为(3,0),然后才把(12,3)插入到表中。
    看上去是通的,但是你要知道,表的锁定问题是存在的,你的触发器在工作的时候,是对本表锁定的,在此期间是不能修改该表的。除非等到触发器事务提交。你制作了一个类似死锁的短暂死锁,就是你要插入,系统说不行,我正锁定该表呢,然后,你就没插入,系统就结束了这个假死锁。
      

  3.   

    为什么要这么做?  这个肯定是做不到了的。错误信息很明显:Can't update table 'test' in stored function/trigger because it is already used by statement which invoked this stored function/trigger找个别的方式吧。存储过程 把insert update 分成两个事务?