Это зависит от используемой вами БД.
Если вы используете 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