2013-04-02 68 views
0

我正在寻找触发器的帮助。通过触发器更新pl/sql中多个表的记录

我有如下表格。

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表我已经prepered插入。

我试着用触发器作为belowe

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

回答

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如果没有匹配的行已经存在。如果你对另一个触发器做同样的事情,你应该只为给定的键值插入一行。

分享和享受。

+0

我不明白这是如何工作的:它似乎有在该模式中Autorstwa FK约束,一个人如何能做到的插入该表中而不知道必须使用哪些键? – didierc

+0

嗨鲍勃感谢的答案:) 我已经试过这和它的一些变化工作后, 使用(选择:NEW.ID_AUTORA FROM DUAL) ON(a.ID_AUTORA =新:ID_AUTORA) WHEN NOT MATCHED THEN INSERT( ID_AUTORA) VALUES(:NEW.ID_AUTORA); 但不幸的是我仍然得到两行不是一个。 – Keiishi

+0

迪迪埃可以告诉你,'不知道钥匙'是什么意思?我仍然在学习这些东西,可能我错过了一些东西。我看到,'如果我有参考,那么它的列与确切的名称作为一个即时通讯引用'。还是我错了? – Keiishi

0

我想你是错误地设置关系。为了使用触发器更新第三个表格,第一个和第二个表格的值应该是两者之间的关系,或者应该有一个表格连接第一个和第二个表格。

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最新的值。

我需要它的确定

在那一刻,我没有时间,使程序这一点,但我会做一个和它张贴在这里,我会得到一些自由时间

再次感谢大家的意见:)

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;