【问题标题】:MySQL trigger before insert update column with new auto-increment idMySQL 触发器在插入更新列之前使用新的自动增量 id
【发布时间】:2013-08-23 10:23:26
【问题描述】:

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

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

countryCode 工作正常,但id 始终为空白。我怎样才能实现这样的目标? id 来自 autoincrement 列。

我知道它不起作用,因为它是在插入之后生成的。那么我该怎么做呢?

【问题讨论】:

  • 为什么不创建一个返回该连接值的视图呢?没有真正需要存储它。
  • 我需要该值才能在其他地方使用。我在这里只使用了 2 个值。还有很多要连接的。

标签: mysql sql


【解决方案1】:

AUTO_INCREMENT 列仅在插入后设置

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

此外,您不能以 (http://dev.mysql.com/doc/refman/5.0/en/stored-program-restrictions.html) 的形式对 AFTER INSERT 触发器中使用的表执行更新:

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


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


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

鉴于它的名称,您不是在寻找一种方法来创建复合键吗?类似的东西:

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

【讨论】:

  • 如果我之后也更改它,我会收到错误:/* SQL Error (1362): Updating of NEW row is not allowed in after trigger */。我使用 HeidiSql 来做到这一点。
  • @Norman 据我所知,没有办法通过使用触发器来实现您想要实现的目标。我编辑了我的答案以提供一些替代解决方案。
  • @Norman ALTER TABLE.. 在您的表上创建一个新索引,以防止您对(countryCode, id)重复 值。我只是根据您的专栏名称key 推测这是您想要实现的目标。也许您应该重新定义 what 您正在尝试做的事情,因为在这一点上,似乎没有“简单”的方式可以按照最初的方式使用 MySQL。
  • 你可以使用 select 和最后插入的记录并使用插入后触发器吗?因此,插入记录后,选择最后插入的行,进行连接和更新。这样的事情可能吗?
  • KEY 不会防止重复,只有 UNIQUE 会这样做。
猜你喜欢
  • 1970-01-01
  • 2023-04-11
  • 2011-08-24
  • 2013-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-01
相关资源
最近更新 更多