2017-03-24 11 views
0

ホテルの予約と顧客に関する情報を保存するための小さなデータベースを作成しています。子レコードが存在しない場合、親レコードを削除するCONSTRAINT PostgreSQL

ホテルルームの予約がない場合に限り、ルームテーブルのルームレコードを削除できるようにしたいと考えています。

FOREIGN KEY (hid, room) REFERENCES room (hid, num) 
ON DELETE CASCADE WHEN NOT EXISTS(hid AND room) 

が、それは動作していない:

私は問題を解決しようとしている方法が行うことです。

誰かが私が間違っていることを知っていますか、どのように修正できますか?

CREATE TABLE booking(hid CHAR(4) NOT NULL, 
cid CHAR(4) NOT NULL,  
dstart DATE NOT NULL,  
ndays DATE,  
room INTEGER,  
PRIMARY KEY(hid, cid, dstart), 
FOREIGN KEY (cid) REFERENCES customer (cid)  
ON UPDATE CASCADE  
ON DELETE CASCADE,  
FOREIGN KEY (hid, room) REFERENCES room (hid, num)  
ON DELETE CASCADE WHEN NOT EXISTS(hid AND room)  
); 
+0

これは関係の仕組みではありません。それを手動で行う必要があります。 'on delete cascade'は、例えば次のように動作します。部屋を削除するときは、対応するすべての予約を削除します。 – GurV

+0

部屋を削除すると、ホテルルームの予約がない場合にのみ、対応するすべての予約が削除されますか?ご回答いただきありがとうございます。 @GurV – 48502104

+0

あなたのコメントをお試しください。あなたは部屋を取り除くときに、その部屋の予約がないときにその部屋のすべての予約を取り除くと言っています。意味がありません。また、デフォルト動作 'NO ACTION'では子が存在するときに親行が削除されることはありません。これはあなたが望むものです。 – GurV

答えて

0

外部キー関係ごとに1つの削除ルールを定義する必要があります。

例:子レコードとしての予約の存在が削除を防止する必要がある場合は、ON DELETE RESTRICTを使用します。これは、明示的に状態を指定しない場合のデフォルトルールです。 ON DELETEルールの追加パラメータはありません:あなたが試みているEXISTS句は不可能です。