【问题标题】:adding data from two different tables using a trigger使用触发器从两个不同的表添加数据
【发布时间】:2023-01-24 00:13:17
【问题描述】:

我创建了三个表 A(id、name、date、realnumber、integer)、B(id、name、date、realnumber、integer)和与表 A 相同的 C。它只多了两个列,称为 integerB 和 sequence s .我想创建一个触发器,该触发器将在为每一行输入插入表 B 后触发,以便它保存表 A 的引用行并将表 B 的输入行中的整数添加到表 C 的 integerB 列中。如果该行已存在于表 C 仅应添加 integerB。对于序列 s,下一个值添加到表 A 行的第一个插入中。

我没有那么多地使用触发器,所以当我必须从多个表插入数据时,我不确定如何解决这个问题。这是我的触发器。

CREATE OR REPLACE TRIGGER trig1
AFTER INSERT ON B
FOR EACH ROW
INSERT INTO C (integerB) VALUES (NEW.integer); 
INSERT INTO C (id, name, date, realnumber)
SELECT a.id, a.name, a.date, a.realnumber FROM A a; 
END;
/ 

【问题讨论】:

    标签: oracle triggers sqltools


    【解决方案1】:

    首先你真的需要使用更好的列名和表名,因为其中很多都是保留字......这使得一切都比它需要的复杂得多。


    目前还不完全清楚你想做什么,但似乎如果有人要将 ID = 1 的记录插入 B 那么你想从 A 获取 ID = 1 的值并将它们存储在 @ 987654323@以及插入B的整数值

    在这种情况下,您想在触发器中使用 MERGE 语句 (UPSERT) 之类的

    CREATE OR REPLACE TRIGGER T1
    AFTER INSERT ON B
    FOR EACH ROW
    BEGIN
      MERGE INTO C C
      USING (SELECT * FROM A WHERE ID = :NEW.ID) A
      ON (C.ID = :NEW.ID)
      WHEN MATCHED THEN UPDATE
        SET C.INTEGERB = :NEW.INTEGER,
            C.SEQUENCE = C.SEQUENCE + 1
      WHEN NOT MATCHED THEN 
        INSERT (ID, NAME, DATE, REALNUMBER, INTEGER, INTEGERB, SEQUENCE)
        VALUES (A.ID, A.NAME. A.DATE, A.REALNUMBER, A.INTEGER, :NEW.INTEGERB, 0);
     
    END;
    /
    

    对于序列,当新记录插入C 时,它已设置为 0,然后在每次更新 integerB 时递增。我不确定这是否是您想要的。

    您应该能够调整它以匹配您需要的确切连接和逻辑。

    提示

    首先让您的 SQL 语句使用文字值,然后将其转换为您的触发器。如果您可以在尝试使事情变得更复杂之前先手动工作,那将会容易得多

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-05
      • 2013-11-25
      • 2016-08-15
      相关资源
      最近更新 更多