首页 >数据库 >mysql教程 >为什么我无法更新 MySQL 存储函数或触发器中的表?

为什么我无法更新 MySQL 存储函数或触发器中的表?

Linda Hamilton
Linda Hamilton原创
2024-12-25 00:05:20869浏览

Why Can't I Update a Table Within a MySQL Stored Function or Trigger?

MySQL 错误:无法更新存储函数/触发器中的表

问题:

尝试使用触发器向MySQL表中插入新行时,出现以下错误发生:

Can't update table 'brandnames' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

答案:

当 INSERT 触发器尝试修改调用它的表时,会遇到此错误。 MySQL 禁止这种行为有两个主要原因:

  • 锁定冲突: INSERT 可能会执行锁定操作,如果触发器也尝试锁定表,则可能导致死锁。
  • 无限递归:如果触发器更新同一个表中的一行,它可以导致同一触发器无限期地触发,从而导致无限循环。

要解决此错误,请考虑使用以下方法:

  • 访问新值: 不要在触发器中修改表,而是使用 NEW.fieldname 访问新插入的值并设置其他字段
  • 预插入修改: 使用 BEFORE INSERT 触发器在将值插入表之前修改值。这可以避免无限递归问题。

例如,要从全名的前两个字符创建短名称字段,可以使用以下 BEFORE INSERT 触发器:

CREATE TRIGGER `capital` BEFORE INSERT ON `brandnames`
FOR EACH ROW BEGIN
  SET NEW.short_name = CONCAT(UCASE(LEFT(NEW.full_name,1)) , LCASE(SUBSTRING(NEW.full_name,2)))
END

以上是为什么我无法更新 MySQL 存储函数或触发器中的表?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn