错误代码:1442。无法更新存储函数/触发器中的表“客户”,因为它已被调用此存储函数的语句使用

Posted

技术标签:

【中文标题】错误代码:1442。无法更新存储函数/触发器中的表“客户”,因为它已被调用此存储函数的语句使用【英文标题】:Error Code: 1442. Can't update table 'customer' in stored function/trigger because it is already used by statement which invoked this stored function 【发布时间】:2021-07-17 03:42:39 【问题描述】:

我正在编写一个查询,该查询创建一个触发器,以使用名为“IsDelete”的标志软删除表 customer 中的一行,当标志为“0”时,它不会被删除,而当标志变为 1 时,该行具有已被标记为已删除。

运行查询时会生成错误代码 1442c。谁能解释一下为什么?

DELIMITER $$

CREATE TRIGGER SOFT_DELETE_TRIGGER
BEFORE DELETE ON customer
FOR EACH ROW 
BEGIN
    IF OLD.IsDelete = 0 THEN
        CALL cannot_delete_error;
        UPDATE customer
        SET IsDelete = 1;
    END IF;
END
$$

删除表中的一行以测试触发器。

DELETE FROM customer
WHERE C_username = 'testuser'

【问题讨论】:

【参考方案1】:

是的,触发器不允许您对生成触发器的同一个表执行 INSERT/UPDATE/DELETE,因为这可能会再次运行调用触发器,然后该触发器可能会执行另一个 INSERT/UPDATE/DELETE,等等在。导致无限循环的可能性太大。

恐怕 mysql 不支持像 some other brands of SQL database do 这样的“替代”触发器。您不能在 DELETE 上触发执行更新的触发器。

您可以使用SIGNAL 使其抛出错误,这会阻止 DELETE,但它不会执行 UPDATE。

要实现软删除,您只需让客户端使用 UPDATE 而不是 DELETE。

【讨论】:

即使使用UPDATE查询同样的错误信息显示?任何想法 是的,就像我上面说的,你不能插入/更新/删除同一张表。 谢谢,有什么想法可以从触发器更新同一个表列吗? 是的,执行 UPDATE 而不是 DELETE。 MySQL 不支持“代替”触发器。 Microsoft SQL Server 具有使用选项INSTEAD OF DELETE(或其他 DML 操作)定义的触发器类型。这意味着它执行触发器主体中的操作,但它执行生成触发器的原始删除。在此处阅读:sqlservertutorial.net/sql-server-triggers/… MySQL 不支持触​​发器的此选项;触发器可能会失败,但这意味着删除和触发器的操作都会失败。

以上是关于错误代码:1442。无法更新存储函数/触发器中的表“客户”,因为它已被调用此存储函数的语句使用的主要内容,如果未能解决你的问题,请参考以下文章

如何处理触发器中的碰撞问题?

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

MySql 错误:无法更新存储函数/触发器中的表,因为它已被调用此存储函数/触发器的语句使用

MySql 触发器删除同一张表中的子记录

1442 - Can't update table 'site' in stored functiontrigger because it is al

MYSQL 更新触发器 - 无法更新存储函数/触发器中的表,因为它已被语句使用