我想要更新表格中的一个列,使用国家代码和新的id
,这是一个自动递增的值。
BEGIN
SET new.key = concat(new.countryCode,new.id);
END
countryCode
工作正常,但 id
总是空白。我该如何实现这样的功能?id
来自一个 autoincrement
列。
我知道它无法工作是因为它是在插入后生成的。那么我该怎么做呢?
我想要更新表格中的一个列,使用国家代码和新的id
,这是一个自动递增的值。
BEGIN
SET new.key = concat(new.countryCode,new.id);
END
countryCode
工作正常,但 id
总是空白。我该如何实现这样的功能?id
来自一个 autoincrement
列。
我知道它无法工作是因为它是在插入后生成的。那么我该怎么做呢?
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);
/* SQL Error (1362): Updating of NEW row is not allowed in after trigger */
。我使用HeidiSql来完成这个操作。 - NormanALTER TABLE..
会在您的表上创建一个新索引,以防止(countryCode, id)
出现重复值。我只是根据您的列名key
猜测这可能是您想要实现的目标。也许您应该重新定义您想要做什么,因为目前似乎没有使用MySQL最初预期的“简单”方法来完成它。 - Sylvain LerouxKEY
不能防止重复,只有UNIQUE
才能做到。 - Ja͢ck