2012-02-07 3 views
0

가질 수 있습니까?MYSQL의 하위 부모 조건?

나는 다른 테이블에서 관련 행이 삭제 된 경우 행의 삭제 강제로 제약이 있습니다

node INT UNSIGNED NOT NULL, 
id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
name VARCHAR(20) NOT NULL,  
title VARCHAR(200) NOT NULL, 
description MEDIUMTEXT, 
category VARCHAR(20) NOT NULL, 
parent INT UNSIGNED DEFAULT 0,    # here is the parent term id 
              # if it's 0 the term has no parent 

PRIMARY KEY(id), 
UNIQUE KEY(name, node, category), 
KEY parent(parent), 
KEY category(category), 

CONSTRAINT terms FOREIGN KEY(node) 
    REFERENCES nodes(id) ON DELETE CASCADE ON UPDATE RESTRICT 

내가 "부모"라는 용어 경우 행의 자동 삭제 강제로 다른 제약 조건을 원하는을 삭제 되었습니까? (용어의 상위 세트가있는 경우)

예 :

node | id | name | title | description | category | parent 
___________________________________________________________________ 
534 | 1 | A  | Foooooo | Bla bla...  | A  | 0 
54 | 2 | B  | Foooooo | Bla bla...  | A  | 1 
45 | 3 | C  | Foooooo | Bla bla...  | A  | 2 
545 | 4 | D  | Foooooo | Bla bla...  | A  | 2 
534 | 5 | E  | Foooooo | Bla bla...  | A  | 1 

그래서 용어는 다음과 같다 : 나는 B를 삭제하면

A 
    - B 
    --- C 
    --- D 
    - E 

그래서, C 및 D뿐만 아니라 삭제하려면 , A, B, C, D, E를 삭제해야하는 경우 ...

답변

3

"조건부"제약 조건은 없습니다. 부모 필드 allways은 다른 행 (즉, 0이 허용되지 않음), 또는 전혀 제한이 없습니다.

이것은 보통 일반적인 사용법입니다. 일반적으로 부모의 ON DELETE TRIGGER으로 작업하고 부모를 기준으로 선택하여 하위를 삭제합니다. 당신의 예에서

당신이 대신 0NULL을 사용할 수 있습니다

CREATE TRIGGER cascade_delete_children 
    BEFORE DELETE ON node 
    FOR EACH ROW 
     DELETE FROM node WHERE parent=OLD.id; 
2

같은 것을 고려하고 계단식으로 FOREIGN KEY을 정의 할 수 있습니다은 삭제합니다

parent INT UNSIGNED NULL DEFAULT NULL, --- here is the parent term id 
              --- if it's NULL the term has no parent 
... 

CONSTRAINT parent_fk FOREIGN KEY(parent) 
    REFERENCES thisTable(id) 
     ON DELETE CASCADE 
     ON UPDATE RESTRICT