2016-04-28 25 views
0

私のトリガーで助けが必要です。私は最初のテーブルの外部キーのような値を持つプライマリキーで削除された行が2番目のテーブルへの外国人のキーの参照で最初のテーブルの削除行のためのOracleでトリガをやっています。別のテーブルの別の削除された行を参照して行を削除するためのトリガー

私はこれらのテーブルを持っている:

CREATE TABLE Room (
    id_room NUMBER(5) NOT NULL, 
    . 
    . 
    price VARCHAR(10) NOT NULL, 

    PRIMARY KEY(id_mistnosti), 

); 

CREATE TABLE item1 (
    id_room NUMBER(5) NOT NULL, 
    . 
    . 

    FOREIGN KEY(id_room) REFERENCES Room 
); 

CREATE TABLE item2(
    id_room NUMBER(5) NOT NULL, 
    . 
    . 
    FOREIGN KEY(id_room) REFERENCES Room 
); 

私は2つの項目を持つテーブルの部屋を、持っているので、私は自分の部屋を削除するときに、これらの2つの項目を削除する必要があります。

CREATE OR REPLACE TRIGGER removeRoomsItems 
BEFORE DELETE ON Room 
FOR EACH ROW 
WHEN (:Room.id_mistnosti = :item1.id_mistnosti) 
BEGIN 
    DELETE FROM item1; 
END; 
/

私のsqldeveloperエラーがWHEN句であることを書いている:

は今、私は一つだけのアイテムを削除しようとしています。 両方のアイテムを削除する際のガイドが必要です。

答えて

2

expresionトリガーにされます悪い。トリガーは、次のようになりますことができます:PL/SQLファンクションで

CREATE OR REPLACE TRIGGER removeRoomsItems 
BEFORE DELETE ON Room 
FOR EACH ROW 
BEGIN 
    DELETE FROM item1 WHERE id_room = :old.id_room ; 
END; 

を使用していますが、のIF IF、ELSE ENDを使用しないでください。。

は、しかし、あなたは、このトリガーを必要としないので、uはテーブルをこのように作成する必要がある、カスケードFKを使用します。

CREATE TABLE item2(
    id_room NUMBER(5) NOT NULL, 
    . 
    . 
    FOREIGN KEY(id_room) REFERENCES Room ON DELETE CASCADE; 
); 

はこのようにトリガを使用しないでください、それは非常に悪い方法です。

+1

'when'部分は有効な構文です。トリガーが発火するときの条件を定義します。トリガーボディの一部ではありません。しかしながら、それは、「各行のために」必要とされる。 –

0

この場合、トリガーは必要ありません。

ON句はあなたが 参照先の主キーまたは一意キー値を削除する場合、Oracle データベースが自動的に参照整合性を維持する方法を決定することができますDELETE DELETE句の
http://docs.oracle.com/cd/B19306_01/server.102/b14200/clauses002.htm


ちょうどON DELETE CASCADE句を使用します。この句を省略すると、 オラクルでは、子表の従属行を持つ 親表内の参照先のキー値を削除できません。

従属外部キー の値を削除する場合は、CASCADEを指定します。

を指定します.Oracleが従属外部キー の値をNULLに変換する場合は、SET NULLを指定します。

この単純な例を参照してください。

CREATE TABLE Room (
    id_mistnosti int, 
    id_room NUMBER(5) NOT NULL, 
    price VARCHAR(10) NOT NULL, 
    PRIMARY KEY(id_mistnosti) 
); 

CREATE TABLE item1 (
    id_room NUMBER(5) NOT NULL, 
    item_name varchar(100), 
    FOREIGN KEY(id_room) REFERENCES Room ON DELETE CASCADE 
); 

CREATE TABLE item2(
    id_room NUMBER(5) NOT NULL, 
    item_name varchar(100), 
    FOREIGN KEY(id_room) REFERENCES Room ON DELETE CASCADE 
); 

insert into room values(1, 1, 100); 
insert into room values(2, 2, 200); 

insert into item1 values(1, 'room 1'); 
insert into item1 values(1, 'room 11'); 
insert into item1 values(2, 'room 2'); 
insert into item1 values(2, 'room 22'); 

insert into item2 values(1, 'room 1'); 
insert into item2 values(1, 'room 11'); 
insert into item2 values(2, 'room 2'); 
insert into item2 values(2, 'room 22'); 

commit; 

となりました:

SELECT * FROM item2; 

    ID_ROOM ITEM_NAME 
---------- ---------- 
     1 room 1  
     1 room 11 
     2 room 2  
     2 room 22 

は部屋を削除し、この削除は、アイテムをどのように影響するかを参照してください。

delete from room where id_mistnosti = 1; 

select * from item2; 

    ID_ROOM ITEM_NAME 
---------- ---------- 
     2 room 2  
     2 room 22 
関連する問題