请,有人能告诉我这是什么错误..因为我想触发修改的状态单元格的值从1到0之前删除过程
错误代码:1442无法更新存储的函数/触发器中的表“tabletemp”,因为它已被调用此存储的函数/触发器的语句使用。
CREATE DEFINER=`root`@`localhost`
TRIGGER `beforeDelete` BEFORE DELETE
ON `tabletemp` FOR EACH ROW
BEGIN
UPDATE tabletemp SET statuss = 0 WHERE id IN (OLD.id);
END
表格定义如下:
create table tabletemp(
id INT primary key ,
Nuser VARCHAR(255),
age INT,
statuss INT default 1
);
1条答案
按热度按时间vd2z7a6w1#
这里有两件事。
首先,错误消息的含义是,在MySQL中,您不能在同一个表的触发器中插入/更新/删除一个表,因为这很有可能导致触发器的无限循环。MySQL不允许这样做。
您可以在BEFORE INSERT或BEFORE UPDATE触发器中更改包含
SET NEW.<column_name> = <expression>
的行中的值,但不能更改OLD.<column_name>
。在DELETE触发器中,没有
NEW.<column_name>
。该行没有新版本,因为它正在被删除。这让我怀疑您是否打算让触发器像Microsoft SQL Server中的INSTEAD OF触发器一样工作。
MySQL不支持INSTEAD OF触发器。您可以让DELETE发生,该行将被删除。或者,您可以中止DELETE,而不会进行任何更改。您不能让DELETE执行UPDATE。
自2006年以来,MySQL一直有一个开放的功能请求来实现INSTEAD OF触发器:https://bugs.mysql.com/bug.php?id=16525但它从未实现过。
Microsoft SQL Server是支持INSTEAD OF触发器的其他RDBMS产品的示例(请参见https://www.sqlservertutorial.net/sql-server-triggers/sql-server-instead-of-trigger/)。
您应该记住,Microsoft SQL Server和MySQL是不同的产品,它们具有不同的功能。并非所有RDBMS产品都支持相同的功能。