首页 >数据库 >mysql教程 >为什么 MySQL 会阻止存储函数和触发器中的表修改?

为什么 MySQL 会阻止存储函数和触发器中的表修改?

Barbara Streisand
Barbara Streisand原创
2024-12-07 13:16:18283浏览

Why Does MySQL Block Table Modification in Stored Functions and Triggers?

MySQL 存储函数/触发器错误:表修改被阻止

在 MySQL 中执行存储函数或触发器时,可能会遇到错误:

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

尝试从存储函数或触发器内更新表时会发生此错误,由于潜在的死锁或无限递归而禁止这样做

INSERT 触发器,例如提供的触发器:

CREATE TRIGGER `capital` AFTER INSERT ON `brandnames`
FOR EACH ROW UPDATE brandnames
SET bname = CONCAT( UCASE( LEFT( bname, 1 ) ) , LCASE( SUBSTRING( bname, 2 ) ) )

尝试在 INSERT 操作仍处于活动状态时更新品牌名称表。 MySQL 会阻止这种情况,以保持数据完整性并避免潜在的错误。

要解决此问题,请考虑使用以下方法:

  • 访问新值: 使用 NEW .fieldname 用于访问 INSERT 操作期间设置的值。这允许您修改派生值而不影响表。
  • 使用 Before 触发器: 如果可能,将表修改逻辑移至 BEFORE INSERT 触发器。这允许您在 INSERT 完成之前设置派生值,从而避免错误。

例如,以下触发器将根据 full_name 列中的值更新small_name 列:

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

以上是为什么 MySQL 会阻止存储函数和触发器中的表修改?的详细内容。更多信息请关注PHP中文网其他相关文章!

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