Когда использовать «ничто» или «ограничить» для «on_delete» с Ecto? - PullRequest
1 голос
/ 03 февраля 2020

Я прочитал этот вопрос , но я не понимаю эту часть:

существенная разница между этими двумя вариантами заключается в том, что [: ничто] позволяет проверке быть отложенным до более поздней стадии транзакции, тогда как [: restrict] - нет.

Когда я узнаю, что мне нужно отложить проверку или нет, поскольку я знаю, что мне все равно нужно проверять?

1 Ответ

2 голосов
/ 03 февраля 2020

Это зависит от используемой вами БД.

Если вы используете MySQL, они точно такие же, потому что проверки всегда выполняются в начале транзакции.

БЕЗ ДЕЙСТВИЯ: ключевое слово из стандартного SQL , В MySQL, что эквивалентно ОГРАНИЧЕНИЮ. Сервер MySQL отклоняет операцию удаления или обновления для родительской таблицы, если в указанной таблице есть значение связанного внешнего ключа. Некоторые системы баз данных имеют отложенные проверки, и NO ACTION является отложенной проверкой. В MySQL ограничения внешнего ключа проверяются немедленно, поэтому НИКАКОЕ ДЕЙСТВИЕ не совпадает с ОГРАНИЧЕНИЕМ. Источник: https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html

Если мы посмотрим на документацию Postgres, то увидим разницу.

Ограничение и каскадное удаление два наиболее распространенных варианта. RESTRICT предотвращает удаление указанной строки. NO ACTION означает, что если при проверке ограничения все еще существуют какие-либо ссылочные строки, возникает ошибка; это поведение по умолчанию, если вы ничего не указали. (Существенное различие между этими двумя вариантами заключается в том, что НИКАКОЕ ДЕЙСТВИЕ не позволяет отложить проверку до более поздней стадии транзакции, а ОГРАНИЧЕНИЕ - нет.) Источник: https://www.postgresql.org/docs/9.5/ddl-constraints.html

Мне также было любопытно, почему вы можете выбрать один над другим, и ответ, кажется, производительность. Посмотрите на эту почтовую ветку:

Что касается того, почему вы можете хотеть отложенную проверку, единственное практическое использование, о котором я могу подумать, - это удалить строку, на которую есть ссылка, в основной таблице, затем вставьте строку замены с тем же ключом, прежде чем завершить транзакцию. В принципе, вы можете сделать это как одно ОБНОВЛЕНИЕ, но может случиться так, что логика вашего приложения c сделает это неловким. Источник: https://www.postgresql.org/message-id/4271.1233022978%40sss.pgh.pa.us

...