使用自动增量字段插入触发器之前/之后

时间:2011-05-13 11:55:50

标签: mysql triggers

我遇到了一个插入触发器的麻烦,它应该修复表中的一列:

id        - auto increment int
thread_id - int [NULL]

我想要实现的是将thread_id设置为id,如果它插入为NULL。我失败了因为:

  • 使用before insert触发器仍然没有id的新值,并且神秘地将thread_id设置为0
  • 使用after insert - update触发器会抛出合理的异常can't update table because it is already used by the statement
  • 您无法添加其他自动增量字段

这个问题的解决方案是什么?

3 个答案:

答案 0 :(得分:0)

DELIMITER $$

CREATE TRIGGER mytrigger BEFORE INSERT ON yourtable 
FOR EACH ROW BEGIN

SET NEW.thread_id = IF(ISNULL(NEW.thread_id), 0, NEW.thread_id);

END;

$$

编辑:为了修改当前记录的值,您不使用UPDATE语句,使用NEW.columname

访问它们

答案 1 :(得分:0)

我发现获得新增量值的唯一方法并不是一种奇特的形式。我假设你要插入一个新值,所以假设它是最大id + 1:

CREATE TRIGGER mytrigger BEFORE INSERT ON yourtable 
FOR EACH ROW BEGIN
SET NEW.thread_id = IF(
ISNULL(NEW.thread_id), 
(SELECT MAX(id) + 1 FROM yourtable), 
NEW.thread_id);
END;

它适用于我的情况,如果它为NULL,它将获得最大ID + 1,这将是新的id。

答案 2 :(得分:0)

我有同样的问题。
下面的代码不起作用:

    `DELIMITER #
CREATE DEFINER='user'@'server' TRIGGER mytrigger BEFORE INSERT ON mytable
       FOR EACH ROW 
       BEGIN
       INSERT INTO mytable (thread_id) VALUES (NEW.thread_id);
       END#
DELIMITER ;`

通过这种方式,将thread_id字段设置为0,并将id字段(PK AUTO INCREMENT)设置为thread_id值(谁是侦听表中的ID PK AI) )。

实际上,在INSERT中未定义AI字段。我通过以下方式解决了这个问题:

    `DELIMITER #
CREATE DEFINER='user'@'server' TRIGGER mytrigger AFTER INSERT ON mytable
       FOR EACH ROW 
       BEGIN
       INSERT INTO mytable (id, thread_id) VALUES (null, NEW.thread_id);
       END#
DELIMITER ;`

统计PK id字段和null的值,AI问题就消失了。
我也将BEFORE替换为AFTER,但不确定是否需要进行此修改才能解决此问题。我没有测试将BEFORE与其他修改一起使用是否能完全解决问题。

相关问题