2017-03-24 5 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

관계가 작동하는 방식이 아닙니다. 수동으로해야 할 것입니다. 'delete delete cascade'는 예를 들어 작동합니다. 방을 제거 할 때 모든 해당 예약을 제거하십시오. – GurV

+0

방을 제거 할 때 호텔 방의 예약이없는 경우에만 모든 해당 예약이 제거 될 수 있습니까? 당신의 응답을 주셔서 감사합니다. @GurV – 48502104

+0

의견을 읽으십시오. 방을 제거 할 때 예약이없는 경우 해당 방의 모든 예약을 제거하십시오. 말이되지 않습니다. 또한, 기본 동작'NO ACTION'은 자식 행이있을 때 부모 행을 삭제하지 못하게합니다. 이것은 내가 원하는 것입니다. – GurV

답변

0

외래 키 관계 당 하나의 삭제 규칙을 정의해야합니다.

예를 들어, 하위 레코드로 예약 된 것이 있으면 삭제를 방지해야하며 ON DELETE RESTRICT를 사용하십시오. 명시 적으로 상태를 지정하지 않으면 기본 규칙이기도합니다. ON DELETE 규칙에는 추가 매개 변수가 없습니다. EXISTS 절을 사용할 수 없습니다.