错误代码: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 错误:无法更新存储函数/触发器中的表,因为它已被调用此存储函数/触发器的语句使用
1442 - Can't update table 'site' in stored functiontrigger because it is al