2012-02-07 4 views
0

외래 키와 캐스케이드 연산에 새로운 것이므로 다음 시나리오에 대해 궁금합니다.외래 키 여러 부모가있는 테이블의 CASCADE DELETE?

완전히 다른 데이터를 가진 두 개의 완전히 다른 부모 테이블 (HUMAN 및 ALIEN)이 있다고 가정 해 보겠습니다. 이제는 인간과 외계인 모두 우주선을 소유 할 수있는 SPACESHIP이라는 하위 테이블을 만들면됩니다. FK는 인간의 행이나 ALIEN 행을 가리키고 있습니다. 인간의 행 또는 외계인 행이 있으면 해당 부모가 소유 한 해당 우주선을 계단식으로 삭제합니다. FK 's와 CASCADE DELETE로 이것을 할 수있는 좋은 방법이 있습니까? 아니면 그냥 인간과 컬럼에 spaceship_id라는 열이 있어야하고 수동으로/트리거를 통해 우주선의 삭제를 처리할까요? 액션의 다른 코스?

도움말!

답변

0

InnoDB 스토리지 엔진을 사용하는 경우 현재 InnoDB 만 지원하므로 외래 키를 사용할 수 있습니다. 두 HumanAlien 테이블을 아류로 그렇지 않으면 당신이 그 (그것 Being를 호출 할 수 있습니다)이 슈퍼 테이블을 추가하여 해결할 수있는 하나의 쿼리를 사용하여 부모와 자식 기록, 예컨대을 :

DELETE HUMAN, SPACESHIP 
FROM HUMAN 
JOIN SPACESHIP 
    ON HUMAN.id = SPACESHIP.id 
WHERE HUMAN.id = 1; 
1

triggers를 사용하거나 삭제할 수 있습니다. 그런 다음 FOREIGN KEY 제약 조건은이 수퍼 테이블을 참조합니다.

수퍼 타입 ​​:

CREATE TABLE Being 
(BeingId INT AUTO_INCREMENT 
, ... other stuff about beings 
, PRIMARY KEY (BeingId) 
) ENGINE = InnoDB ; 

하위 유형 :

CREATE TABLE Human 
(BeingId INT       --- not AUTO_INCREMENT 
, ... other stuff about humans 
, PRIMARY KEY (BeingId) 
, CONSTRAINT Being_Human_fk 
    FOREIGN KEY (BeingId) 
     REFERENCES Being(BeingId) 
     ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE = InnoDB ; 

CREATE TABLE Alien 
(BeingId INT       --- not AUTO_INCREMENT 
, ... other stuff about aliens 
, PRIMARY KEY (BeingId) 
, CONSTRAINT Being_Alien_fk 
    FOREIGN KEY (BeingId) 
     REFERENCES Being(BeingId) 
     ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE = InnoDB ; 

Spaceship 테이블 :

CREATE TABLE Spaceship 
(SpaceshipId 
, SpaceshipName 
, OwnerId 
, ... other stuff about spaceships 
, PRIMARY KEY (SpaceshipId) 
, CONSTRAINT Being_Spaceship_fk 
    FOREIGN KEY (OwnerId) 
     REFERENCES Being(BeingId) 
     ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE = InnoDB ; 
+0

덕분에, 내가 전에이 같은 짓을했다; 현재 프로젝트에서이 전략을 사용할 수 있을지 모르겠다. (예를 들어 인간과 사람이 정확히 같지 않다. 실제로는 이미 그런 테이블에서 내려왔다.) 나는 이것을 다시 생각해 볼 것이다. – user1193694

+0

실망. 나는 스타 트랙 게임을 만들고 있다고 생각했다. ( –