提问人:H22 提问时间:1/23/2023 最后编辑:H22 更新时间:1/24/2023 访问量:46
使用触发器从两个不同的表添加数据
adding data from two different tables using a trigger
问:
我创建了三个表 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;
/
答:
首先,您确实需要使用更好的列和表名称,因为其中很多都是保留字......这使得一切都比它需要的要复杂得多。
目前还不完全清楚您要做什么,但似乎如果有人要插入 ID = 1 的记录,那么您希望从 ID = 1 中获取值并将它们与插入的整数值一起存储在B
A
C
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.INTEGER, 0);
END;
/
对于序列,当插入新记录并在每次更新整数 B 时递增时,此值已设置为 0。我不确定这是否是你想要的。C
您应该能够对其进行调整以匹配所需的确切连接和逻辑。
提示
首先让 SQL 语句使用文本值,然后将其转换为触发器。如果你能先让一些东西手动工作,然后再尝试让事情变得更复杂,那会容易得多
评论
C
A
B
B
A
B
C
A
B
C
评论