我正在寻找触发器的帮助。
我有如下表格。
CREATE TABLE Autorzy(Id_autora numeric(5), Imie varchar(15), Nazwisko varchar(20), constraint auth_pk PRIMARY KEY (Id_autora));
CREATE TABLE Ksiazki(ISBN numeric(10) PRIMARY KEY, Wydawca varchar(30), Tytul varchar(70), Rok numeric(4));
CREATE TABLE Autorstwa (ISBN numeric(10) references Ksiazki, Id_autora numeric(5) references Autorzy);
CREATE TABLE Tematy (Nrtematu numeric(4) PRIMARY KEY, Nazwa varchar(20), Wyjasnienie varchar (100));
CREATE TABLE Na_temat( ISBN numeric(10) references Ksiazki, Nrtematu numeric(10) references Tematy);
create sequence id_autora_seq
start with 1
increment by 1
;
create sequence isbn_seq
start with 1
increment by 1
;
我必须为表格Autorzy,Ksiazki和Autorstwa实现插入。
我已按照以下方式预先插入
insert into Autorzy
values( Id_autora_seq.nextval, 'Jan', 'Mak');
insert into Ksiazki
values (isbn_seq.nextval, 'ABC', 'Poradnik', 2010);
我不知道如何更新Autorstwa表。
我尝试使用触发器,如下所示
create or replace
trigger Autorstwa_auth
after insert or update on keiishi.Autorzy
for each row
begin
insert into Autorstwa (Id_autora)
values (:new.id_autora);
end;
create or replace
trigger Autorstwa_ks
after insert or update on keiishi.Ksiazki
for each row
begin
insert into Autorstwa (ISBN)
values (:new.ISBN);
end;
它在Autorstwa表中创建了两行,这对我来说是不可接受的。
任何人都可以解释一下如何为多个表更新触发器吗?
或其他一些方法我怎么能做到?
提前致谢。
最好的问候
Keiishi
答案 0 :(得分:1)
您可以尝试使用MERGE语句重写您的触发器。我会做一个,你可以做另一个。 : - )
CREATE OR REPLACE TRIGGER AUTORSTWA_AUTH
AFTER INSERT OR UPDATE ON KEIISHI.AUTORZY
FOR EACH ROW
BEGIN
MERGE INTO AUTORSTWA a
USING(SELECT :NEW.ID_AUTORA FROM DUAL) d
ON (a.ID_AUTORA = d.ID_AUTORA)
WHEN NOT MATCHED THEN
INSERT (ID_AUTORA)
VALUES (:NEW.ID_AUTORA);
END AUTORSTWA_AUTH;
以这种方式编写,如果没有匹配的行已存在,MERGE语句将仅导致将行插入AUTORSTWA_AUTH。如果对其他触发器执行相同的操作,则只应为给定的键值插入一行。
分享并享受。
答案 1 :(得分:0)
我认为你错误地设置了关系。为了使用触发器更新第三个表,使用第一个和第二个表的值,两者之间应该存在关系,或者应该有一个表连接第一个和第二个表。
答案 2 :(得分:0)
我将表Autorstwa改为
CREATE TABLE Autorstwa (ISBN numeric(10) references Ksiazki(ISBN), Id_autora numeric(5) references Autorzy(Id_Autora), constraint pk_auto PRIMARY KEY (ISBN, Id_autora));
至于在此表中插入新值,最后我使用了普通插入
insert into Autorstwa
select max(ISBN), max(Id_Autora) from Ksiazki , Autorzy
所以我可以从Ksiazki和Autorzy获得最新的价值。
根据我的需要,可以
在某个时刻,我没有时间为此制作程序,但我会制作一个并在此处发布,当我将获得一些空闲时间
再次感谢大家的建议:)
答案 3 :(得分:0)
它对我有用
CREATE OR REPLACE VIEW new_book AS
SELECT k.ISBN, k.Wydawca, k.Tytul, k.Rok,
a.Id_Autora, a.Imie, a.Nazwisko
FROM Autorzy a, Ksiazki k, Autorstwa au
WHERE a.id_autora = (SELECT au.Id_Autora FROM Autorstwa au WHERE au.ISBN = (SELECT k.ISBN FROM Ksiazki k));
CREATE OR REPLACE TRIGGER new_book_insert
INSTEAD OF INSERT ON new_book
DECLARE
duplicate_info EXCEPTION;
PRAGMA EXCEPTION_INIT (duplicate_info, -00001);
BEGIN
INSERT INTO Autorzy (Id_Autora, Imie, Nazwisko)
VALUES (
:new.Id_Autora,
:new.Imie,
:new.Nazwisko);
INSERT INTO Ksiazki (ISBN, Wydawca, Tytul, Rok)
VALUES (
:new.ISBN,
:new.Wydawca,
:new.Tytul,
:new.Rok);
INSERT INTO Autorstwa (ISBN, Id_Autora)
VALUES (
:new.ISBN,
:new.Id_Autora);
EXCEPTION
WHEN duplicate_info THEN
RAISE_APPLICATION_ERROR (
num=> -20107,
msg=> 'Duplicate Id_Autora or ISBN');
END new_book_insert;