MySQL触发器:在插入时更新带有新的自增ID列的数据。

4

我想要更新表格中的一个列,使用国家代码和新的id,这是一个自动递增的值。

BEGIN
SET new.key = concat(new.countryCode,new.id);
END

countryCode 工作正常,但 id 总是空白。我该如何实现这样的功能?id 来自一个 autoincrement 列。

我知道它无法工作是因为它是在插入后生成的。那么我该怎么做呢?


为什么不创建一个返回连接值的视图呢?没有真正需要存储这个值。 - user330315
我需要将这个值用在其他地方。我只在这里使用了两个值。还有许多值将被连接起来。 - Norman
1个回答

5

AUTO_INCREMENT列仅在插入后才会被设置。

如果您需要访问该值,只能在AFTER INSERT触发器中进行。但是,在AFTER UPDATE触发器中无法修改列的值...

此外,您不能对用于AFTER INSERT触发器的表执行更新操作,因为(http://dev.mysql.com/doc/refman/5.0/en/stored-program-restrictions.html):

在存储函数或触发器中,不允许修改已经被语句使用(用于读取或写入)的表。


在这种情况下,唯一合理的解决方案是创建一个存储过程来更新表,在事务中调整相关列以“模拟”原子插入语句。


话虽如此,在您的特定情况下key列是多余的,因为该列只是同一行的两个其他列的串联。

鉴于它的名称,您是不是正在寻找创建复合键的方法?类似这样:

ALTER TABLE tbl ADD UNIQUE KEY (countryCode, id);

如果我把它改成after,就会出现错误:/* SQL Error (1362): Updating of NEW row is not allowed in after trigger */。我使用HeidiSql来完成这个操作。 - Norman
据我所知,使用触发器无法实现您尝试实现的目标。我编辑了我的答案,提供了一些替代方案。 - Sylvain Leroux
@Norman,ALTER TABLE.. 会在您的表上创建一个新索引,以防止(countryCode, id)出现重复值。我只是根据您的列名key猜测这可能是您想要实现的目标。也许您应该重新定义您想要做什么,因为目前似乎没有使用MySQL最初预期的“简单”方法来完成它。 - Sylvain Leroux
你能否在使用 after insert 触发器时,使用 select 语句选择最后插入的记录?这样,在记录插入后,就可以选择最后插入的行,进行连接并更新。类似这样的操作是否可行? - Norman
KEY不能防止重复,只有UNIQUE才能做到。 - Ja͢ck
@Jack 谢谢你指出来。那是一个愚蠢的打字错误,忘记了关键词“UNIQUE”:/ - Sylvain Leroux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接