mysql - (MySQL) 无法更新存储函数/触发器中的表 'PARTS',因为它已被调用此存储函数/触发器的语句使用

标签 mysql sql database-trigger mysql-error-1442

如果条目在表格中,我希望更新金额,否则插入新条目。

delimiter $$
CREATE TRIGGER t 
BEFORE INSERT 
ON PARTS
for each row

BEGIN
  if exists (SELECT Part_name FROM PARTS where part_name = new.part_name) then
      UPDATE PARTS SET amount=amount+NEW.amount WHERE 
      Part_name=NEW.Part_name;
   end if;
END $$
delimiter ;

当我尝试时:

mysql> insert into PARTS(Part_name,amount,Storage_ID) values('barley',1000,1);

然后我得到这个错误:

ERROR 1442 (HY000): Can't update table 'PARTS' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

我有什么错?有什么想法吗?

最佳答案

您不需要触发器。您想要插入重复键更新:

insert into PARTS(Part_name, amount, Storage_ID)
    values('barley', 1000, 1)
    on duplicate key update amount = amount + values(amount);

为此,您需要在 parts(part_name) 上有唯一索引或主键。或者可能在 parts(part_name, storage_id) 上。目前还不清楚它是如何适应的。

关于mysql - (MySQL) 无法更新存储函数/触发器中的表 'PARTS',因为它已被调用此存储函数/触发器的语句使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53854359/

相关文章:

MySQL触发if-else插入更新

php - 在不查看 MySQL 日志的情况下查看和调试准备好的 PDO 查询

php - 处理大量数据

mysql - SQL JOIN 查询语法

sql - 将 SQL 表中的 JSON 值转换为多列

具有字符范围和区分大小写列的 SQL Server LIKE 运算符

mysql - 有没有办法在 mysql now() 函数中显示上午/下午?

javascript - PostgreSQL + JS : Creating a query based on a random array length of 1-5 values

mysql - 无法更新存储触发器中的表,因为它已被调用此存储触发器的语句使用

java - 获取数据库表的触发器名称