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

Mysql 使用自动增量字段插入触发器之前/之后,mysql,triggers,Mysql,Triggers,我遇到了一个insert触发器的问题,该触发器用于修复表中的一列: id - auto increment int thread_id - int [NULL] 我想要实现的是将thread\u id设置为id,如果它被插入为NULL。我失败是因为: 在插入之前使用触发器仍然没有id的新值,并且神秘地将线程id设置为0 在insert-update之后使用触发器会引发合理的异常无法更新表,因为语句已使用该表 不能添加其他自动增量字段 这个问题的解决办法是什么 DELIMITE

我遇到了一个insert触发器的问题,该触发器用于修复表中的一列:

id        - auto increment int
thread_id - int [NULL]
我想要实现的是将
thread\u id
设置为
id
,如果它被插入为NULL。我失败是因为:

  • 在插入之前使用
    触发器仍然没有
    id
    的新值,并且神秘地将
    线程id
    设置为0
  • 在insert-update之后使用
    触发器会引发合理的异常
    无法更新表,因为语句已使用该表
  • 不能添加其他自动增量字段
这个问题的解决办法是什么

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.columnName

来访问它们。我发现获取新增量值的唯一方法并不是一种奇特的形式。我假设您正在插入一个新值,因此假设它是最大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;

它对我的案例有效,如果为空,它将获得最大ID+1,这将是新ID。

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

`分隔符#
在mytable上插入之前创建DEFINER='user'@'server'触发器mytrigger
每行
开始
插入mytable(线程id)值(新的.thread\u id);
结束#
定界符`
这样,
thread\u id
字段设置为0,
id
字段(PK自动递增)设置为
thread\u id
值(监听表中的id PK AI是谁)

实际上,插入中没有定义AI字段。我用下面的方法解决了这个问题:

`分隔符#
在mytable上插入后创建DEFINER='user'@'server'触发器mytrigger
每行
开始
在mytable中插入(id,thread_id)值(null,NEW.thread_id);
结束#
定界符`
说明PK
id
字段和
null
值,AI问题消失。

我还将
之前的
替换为
之后的,但我不确定此修改是否有必要解决此问题。我没有测试在使用其他修改之前保留
是否可以解决问题。

这并没有将
线程id设置为
id
。如果它尝试,它会遇到与OP询问的问题相同的问题;在实际插入之前,
NEW.id
为0,之后不能修改
NEW
(因为它已经被存储)或更新表(因为它仍在使用)。