mysql에서 외래 키에 RESTRICT를 사용하는 방법은 무엇입니까?


11

데이터베이스 구조에서

  CREATE TABLE Country (
  name varchar(40) NOT NULL,
  PRIMARY KEY  (name)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

CREATE TABLE City (
  name varchar(40) NOT NULL,
  PRIMARY KEY  (name)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

CREATE TABLE Map (
  country varchar(40) NOT NULL,
  city varchar(100) NOT NULL,
  PRIMARY KEY  (country,city),
  FOREIGN KEY (country) REFERENCES Country (name) ON DELETE CASCADE,
  FOREIGN KEY (city) REFERENCES City (name) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

City이 세 가지 동일한 명령으로 자식의 해당 값을 그대로 두어 부모를 삭제해야 합니다.

  FOREIGN KEY (city) REFERENCES City (name) ON DELETE NO ACTION
  FOREIGN KEY (city) REFERENCES City (name) ON DELETE RESTRICT
  FOREIGN KEY (city) REFERENCES City (name)

그러나 NO ACTIONOR을 사용 RESTRICT하거나 생략 할 때 ON DELETE. MySQL 은이 오류로 부모 열에서 삭제할 수 없습니다.

ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails 
('test'.'Map', CONSTRAINT 'Map_ibfk_2' FOREIGN KEY ('city') REFERENCES 'City'('name')
 ON DELETE RESTRICT

내가 어디 틀렸어? NO ACTION부모를 삭제하고 자식을 고아로 남겨 두는 것이 SQL의 책임이 아닙니까?

답변:


13

DELETE RESTRICT에 대한 MySQL 문서에 따르면

• RESTRICT : 상위 테이블에 대한 삭제 또는 업데이트 작업을 거부합니다. RESTRICT (또는 NO ACTION)를 지정하는 것은 ON DELETE 또는 ON UPDATE 절을 생략하는 것과 같습니다.

NO ACTION은

• 조치 없음 : 표준 SQL의 키워드입니다. MySQL에서는 RESTRICT와 같습니다. 참조 된 테이블에 관련된 외래 키 값이 있으면 InnoDB는 부모 테이블에 대한 삭제 또는 업데이트 작업을 거부합니다. 일부 데이터베이스 시스템에는 지연된 검사가 있으며 NO ACTION은 지연된 검사입니다. MySQL에서는 외래 키 제약 조건이 즉시 확인되므로 NO ACTION은 RESTRICT와 동일합니다.

DELETE RESTRICT는 하위가 아닌 상위가 삭제되지 않도록 보호합니다.


5

부모를 삭제하고 자식을 남기고 싶다면 ON DELETE SET NULL옵션을 원할 것입니다 .

SET NULL : 부모 테이블에서 행을 삭제하거나 업데이트하고 자식 테이블의 외래 키 열을 NULL로 설정하십시오. ON DELETE SET NULL 및 ON UPDATE SET NULL 절이 모두 지원됩니다.

SET NULL 조치를 지정하는 경우 하위 테이블의 열을 NOT NULL로 선언하지 않았는지 확인하십시오.

'하지'마지막 문장의 많은, 그래서 그냥 확인 PARENT_ID 만들, 거기 NULL합니다.

이 관련 질문도 참조하십시오. 외래 키 삭제 / 업데이트 제약 조건에서 SET NULL의 목적은 무엇입니까?

외래 키를 정의하면 부모 테이블에 해당 값이없는 자식 테이블의 항목을 허용하지 않도록 데이터베이스에 지시했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.