使用触发器从两个不同的表添加数据

adding data from two different tables using a trigger

提问人:H22 提问时间:1/23/2023 最后编辑:H22 更新时间:1/24/2023 访问量:46

问:

我创建了三个表 A(id、name、date、realnumber、integer)、B(id、name、date、realnumber、integer)和 C,它们与表 A 相同。它只有另外两列,分别称为 integerB 和序列 s。我想创建一个触发器,该触发器将在为每个行输入插入表 B 后触发,以便它保存表 A 的引用行,并将表 B 的输入行中的整数添加到表 C 的整数 B 列中。如果表 C 中已存在该行,则只应添加整数 B。当涉及到序列 s 时,第一个值是通过第一次插入表 A 的行来添加的。

简单解释:表 C 是表 A 的副本,其中包含两列:integerB 和 sequence。触发器的重点是从表 A 中添加新行而不重复,表 B 中的整数 B(表 B 中的整数)和序列应以 1 开头并递增 1。如果重复表 A 中的行,则只应更新整数 B。

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

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 触发器 SQLTOOLS

评论


答:

1赞 Jameson_uk 1/24/2023 #1

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


目前还不完全清楚您要做什么,但似乎如果有人要插入 ID = 1 的记录,那么您希望从 ID = 1 中获取值并将它们与插入的整数值一起存储在BACB

在这种情况下,您希望在触发器中使用 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.INTEGER, 0);
 
END;
/

对于序列,当插入新记录并在每次更新整数 B 时递增时,此值已设置为 0。我不确定这是否是你想要的。C

您应该能够对其进行调整以匹配所需的确切连接和逻辑。

提示

首先让 SQL 语句使用文本值,然后将其转换为触发器。如果你能先让一些东西手动工作,然后再尝试让事情变得更复杂,那会容易得多

评论

0赞 H22 1/24/2023
现在在:new.integerB处有一个错误(错误的绑定变量)
0赞 H22 1/24/2023
表 C 是表 A 的副本,其中包含两列:integerB 和 sequence。触发器的重点是从表 A 中添加新行而不重复,表 B 中的整数 B(表 B 中的整数)和序列应以 1 开头并递增 1。如果重复表 A 中的行,则只应更新整数 B。
0赞 Jameson_uk 1/24/2023
修复拼写错误,但这就是为什么您需要更好的列名。目前还不清楚你真正想要什么,但正如我上面所说,尝试对你想要执行的 SQL 进行排序,然后将其放入触发器中。我不明白你为什么要成为 的副本,然后从触发器开始进行此更新。您需要解释角色扮演以及它如何加入(即,如果我插入一条记录,我如何知道我要更新哪条记录?如果其中有一条记录不在 中,会发生什么情况,如果它仍然存在CABBABCABC