2013-12-16 4 views
1

Это, вероятно, тривиальный вопрос, но я все еще немного неуклюжий, когда дело доходит до ограничений внешнего ключа, поэтому я хотел убедиться.MySQL - внешний ключ при удалении set null in not null field

Скажем, у меня есть таблица countries с полями country_id (PK) и name, и стол cities с полями city_id (PK), name и country_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:

Schema Creation Failed: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `FK_country` (`countryId`), 
    CONSTRAINT `' at line 4: 
+0

Вы уверены? Потому что я создал модель в MySQL Workbench, и это позволило мне экспортировать и импортировать в phpMyAdmin. Я думаю, что это не мешает вам создавать его, но он просто не работает, когда вы пытаетесь удалить записи. – Bobe

+0

@Bobe Я пытался в MySQL 5.5, и я не могу изменить таблицу. И ошибка: 'Ошибка при переименовании '. \ Rptest \ # sql-694_1' to '. \ Rptest \ city' (errno: 150)' –

+0

Хм, на сервере, с которым я работаю, работает MySQL 5.0.96 , Возможно, эта синтаксическая проверка не установлена ​​в этой версии. – Bobe