2013-12-16 2 views
1

이것은 사소한 질문 일 수 있습니다. 그러나 외래 키 제약 조건에 관해서는 여전히 조금 서투른 답니다. MySQL - null이 아닌 필드에서 삭제 집합 null에 대한 외래 키

의 내가 필드 country_id (PK) 및 name 및 필드 city_id (PK)와 테이블 cities있는 테이블 countries 있다고 가정 해 봅시다, namecountry_id (FK).

외래 키 cities.country_id에는 ON DELETE SET NULL의 제약이 있습니다. 알다시피, countries의 레코드가 삭제 된 경우 cities에있는 해당 레코드의 country_id을 참조하는 모든 레코드의 country_id 필드는 NULL로 설정됩니다.

cities.country_id의 속성이 NOT NULL 인 경우는 어떻게됩니까? 이렇게하면 외래 키 제약 조건이 제대로 작동하지 않을 수 있습니까? 그것은 의미가 있지만, 그냥 확인하고 싶습니다.

+2

간단한 질문 - 직접 사용해 보셨습니까? – Rachcha

+0

나는 시험 중입니다.하지만 보통 답을 얻기까지 때로는 시간이 걸리기 때문에 질문을 먼저 게시합니다. 또한 몇 가지 통찰력을 제공하는 제안 목록에 처음에는 나타나지 않은 비슷한 질문을 읽었습니다. – Bobe

답변

1

ON DELETE SET NULL을 외래 키로 설정하면 필드를 NOT NULL으로 설정할 수 없습니다.

그래서 당신은 NOT NULL로 열이있는 테이블을 작성 또는 변경 할 수없는 것입니다 내가 문 아래 실행하면 ON DELETE SET NULL

을 CountryId :

CREATE TABLE `country` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `name` VARCHAR(100) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ; 

CREATE TABLE `city` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `name` varchar(100) NOT NULL, 
    `countryId` int(10) unsigned DEFAULT NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `FK_country` (`countryId`), 
    CONSTRAINT `FK_country` FOREIGN KEY (`countryId`) REFERENCES `country` (`id`) ON DELETE SET NULL ON UPDATE SET NULL 
); 

을 내가 MySQL 5.5에 오류가 발생했습니다 is :

+0

정말입니까? 나는 MySQL Workbench에서 모델을 만들었 기 때문에 phpMyAdmin으로 내보내고 가져올 수있었습니다. 나는 그것이 당신이 그것을 창조하는 것을 방해하지 않는다고 생각하지만, 당신이 레코드를 삭제하려고 할 때 그것은 작동하지 않을 것이다. – Bobe

+0

@Bobe 나는 MySQL 5.5에서 시도했지만 테이블을 변경할 수 없다. 그리고 오류 :'. \ rptest \ # sql-694_1 '의 이름을'. \ rptest \ city '(errno : 150)' –

+0

로 바꾸는 중 오류가 발생했습니다. 제가 사용하고있는 서버가 MySQL 5.0.96을 실행하고 있습니다. . 어쩌면 문법 검사가 해당 버전에없는 것일 수 있습니다. – Bobe