Всякий раз, когда я пытаюсь установить ограничение внешнего ключа на «НИКАКИХ ДЕЙСТВИЙ», MySQL workbench автоматически устанавливает его на «ОГРАНИЧЕНИЕ».

#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-это хорошо.