2011-11-09 4 views
43

두 개의 MySQL 테이블이 있습니다 : collectionsprivacy_level입니다.
나는 같은 외래 키 관계를 정의 :MySQL의 외래 키에 대한 정확한 의미 'delete restrict'절

CREATE TABLE collections (
    coll_id smallint NOT NULL AUTO_INCREMENT UNSIGNED, 
    name varchar(30) NOT NULL, 
    privacy tinyint NOT NULL UNSIGNED DEFAULT '0', 
    PRIMARY KEY(coll_id), 
    INDEX(privacy), 
    FOREIGN KEY fk_priv (privacy) REFERENCES privacy_level (level) ON UPDATE CASCADE ON DELETE RESTRICT 
) ENGINE=InnoDB; 

CREATE TABLE privacy_level (
    level tinyint NOT NULL UNSIGNED, 
    name varchar(20) NOT NULL, 
    PRIMARY KEY (level) 
) ENGINE InnoDB; 

내 질문은 ON DELETE RESTRICT 절에 대해 내가 온라인 매뉴얼 또는 구글 검색에서 답을 도출 할 수 없었다.

절대 행을 privacy_level에서 삭제할 수 있습니까?
또는, 내가 collections.privacy에서 행이 privacy_level.level의 값과 동일한 값을 가지고 경우 privacy_level에서 행을 삭제할 수 있음을 의미합니까? privacy_levellevel = 2, name = 'top secret'을 가지고 있지만 collections.Privacy에 항목이 privacy = 2가없는 경우

즉, 나는 level = 2, name = 'top secret' 항목을 삭제할 수 있습니까? 또는 열 단위로 금지됩니까?

어떤 통찰력에도 감사드립니다.

답변

85

ON DELETE RESTRICT자식 행이 상위 행의 값을 참조 존재하는 경우 주어진 상위 행을 삭제할 수 없음을 의미합니다. 상위 행에 참조 하위 행이없는 경우 해당 상위 행을 h 제할 수 있습니다.

ON DELETE RESTRICT은 어쨌든 외래 키에 대한 기본 동작이므로 불필요한 구문입니다.

+0

'ON DELETE RESTRICT'은 'ON DELETE NO ACTION'과 동일합니까? – Shafizadeh

+0

@Shafizadeh, http://www.vertabelo.com/blog/technical-articles/on-delete-restrict-vs-on-delete-no-action –

+0

@Bill을 읽으십시오. NO ACTION은 RESTRICT와 같습니다. MySQL에서, 그리고 그것은 그들의 진술을 되돌리기 위해 [SO] (https://stackoverflow.com/questions/5809954/mysql-restrict-and-no-action)을 참조한다 ... – Code4R7

0

또한 ON DELETE CASCADE을 사용할 수 있습니다. 즉, 부모를 삭제할 때 모든 자식이 자동으로 제거되며 이는 매개 변수 나 설정이 포함 된 다른 테이블과 연결된 테이블이있을 때 유용합니다.

관련 문제