通过触发器更新pl / sql中多个表的记录

时间:2013-04-02 19:49:19

标签: sql plsql

我正在寻找触发器的帮助。

我有如下表格。

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

4 个答案:

答案 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;