如何在 SQL 中对触发器进行语法化,以便在插入后从同一个表中更新列(oracle 数据库)

Posted

技术标签:

【中文标题】如何在 SQL 中对触发器进行语法化,以便在插入后从同一个表中更新列(oracle 数据库)【英文标题】:How to syntax a trigger in SQL in order to UPDATE a column from the same table AFTER INSERT (oracle Database) 【发布时间】:2017-04-18 17:18:14 【问题描述】:

我创建了这个触发器,以便在向 ORDER_DETAIL 表中插入一行后,从表 ITEM 中获取“UNIT_PRICE”并根据“ITEM_ID”将其设置为 ORDER_DETAIL 表的“PRICE”。我语法有任何错误吗?先感谢您!

CREATE OR REPLACE TRIGGER PRICETRIG
AFTER INSERT ON ORDER_DETAIL FOR EACH ROW
BEGIN 
UPDATE ORDER_DETAIL
SET ORDER_DETAIL.PRICE=(SELECT ITEM.UNIT_PRICE FROM ITEM WHERE 
ORDER_DETAIL.ITEM_ID=ITEM.ITEM_ID);
END;

这就是错误:

One error saving changes to table "ORDER_DETAIL":
Row 8: ORA-04091: table ORDER_DETAIL is mutating, trigger/function 
may not see it
ORA-06512: at "PRICETRIG", line 2
ORA-04088: error during execution of trigger 'PRICETRIG'
ORA-06512: at line 1

【问题讨论】:

【参考方案1】:

您应该指的是the NEW pseudorecord,而不是触发器所在的表。它也应该是插入前触发器,例如:

CREATE OR REPLACE TRIGGER PRICETRIG
BEFORE INSERT ON ORDER_DETAIL
FOR EACH ROW
BEGIN
  SELECT ITEM.UNIT_PRICE
  INTO :NEW.ORDER_PRICE
  FROM ITEM
  WHERE ITEM.ITEM_ID = :NEW.ITEM_ID;
END;

您的原始代码试图更新触发器所针对的表中的每一行,而不仅仅是新插入的行。

您可能想检查一下,例如,订单上没有您应该乘以单价的数量字段。

【讨论】:

以上是关于如何在 SQL 中对触发器进行语法化,以便在插入后从同一个表中更新列(oracle 数据库)的主要内容,如果未能解决你的问题,请参考以下文章

如何在使用触发器的 SQL 插入后更新另一个表

如何在张量流中对张量进行子集化?

mysql 触发器

SQLite插入 - 如何使用参数化值避免语法错误时插入任何文本

我可以通过查询将值传递给SQL触发器吗?

sql如何同时向两张表插入数据