0

我正在寻求有关触发器的帮助。

我有如下表格。

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 表中创建了两行,这对我来说是不可接受的。

谁能解释我如何触发多个表的更新?

或者其他一些方法我怎么能做到?

提前致谢。

此致

启石

4

4 回答 4

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 中。如果您对另一个触发器执行相同操作,则应该只为给定的键值插入一行。

分享和享受。

于 2013-04-02T20:31:05.433 回答
0

我认为您设置的关系不正确。为了使用触发器更新第三个表,对于第一个和第二个表的值,两者之间应该存在关系,或者应该有一个表连接第一个和第二个表。

于 2013-04-03T10:59:48.453 回答
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 那里得到最新的价值。

对于我的需要没问题

目前,我没有时间为此制作程序,但我会制作一个并将其发布在这里,当我有空闲时间时

再次感谢大家的建议:)

于 2013-04-03T19:14:06.527 回答
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;
于 2017-11-29T20:37:53.983 回答