#mysql #sql #foreign-keys #relational-database #mysql-workbench
Вопрос:
Я пытаюсь установить внешний ключ для ограничения при удалении и обновлении на «БЕЗ ДЕЙСТВИЙ», но по какой-то причине после того, как я применю изменения, MySQL workbench сам по себе меняет его на «ОГРАНИЧЕННЫЙ», я не знаю, почему он это делает.
Это код, который MySQL Workbench генерирует, когда я пытаюсь изменить ограничения для обновления и удаления на «НИКАКИХ ДЕЙСТВИЙ».
ALTER TABLE `forums`.`post_replies`
DROP FOREIGN KEY `fk_post_replies_users`;
ALTER TABLE `forums`.`post_replies`
ADD CONSTRAINT `fk_post_replies_users`
FOREIGN KEY (`user_id`)
REFERENCES `forums`.`users` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
Ответ №1:
NO ACTION
и RESTRICT
являются синонимами.
«13.1.20.5 Ограничения ВНЕШНЕГО КЛЮЧА»:
NO ACTION
: Ключевое слово из стандартного SQL. В MySQL, эквивалентноRESTRICT
.
Верстак, кажется, просто выбирает для отображения RESTRICT
NO ACTION
(ну, он должен выбрать один и выбрать конкретный MySQL…). Но это не значит ничего другого.
Комментарии:
1. Что делать, если я хочу, чтобы он ничего не делал при удалении родительской строки? Например, если пользователь хочет удалить свою учетную запись, я не хочу, чтобы все его сообщения удалялись
2. @InfinityVive: Ну, что-то должно быть сделано, так как в противном случае были бы противоречивые данные. Одним из вариантов было
ON DELETE SET NULL
бы «отключить» сообщения от пользователя, чтобы его можно было удалить. Или подумайте о том, чтобы просто «мягко» удалить пользователя. т. Е. на самом делеDELETE
это не так, ноUPDATE
какой-то флаг, указывающий, что пользователь больше не активен. Фильтр для этого флага в запросах, которые должны работать только с активными пользователями.3. «ничего не делайте, когда родительская строка удалена», Тогда у вас нет внешнего ключа. Не объявляйте об этом в первую очередь. «мягкое» удаление @sticky bit-это хорошо.