Mysql
 sql >> база данни >  >> RDS >> Mysql

Защо да използвате външни ключове без действие при изтриване или актуализиране

Мисля, че грешно разбирате какво ON DELETE NO ACTION означава. Това не означава потискане на ограничението за външен ключ.

Когато изтриете запис, който е посочен от външен ключ, InnoDB има възможността да предприеме автоматично действие, за да коригира ситуацията:

  • може CASCADE , което означава, изтриване на препращащия запис. (Това би имало смисъл за нещо като user_address.user_id . Ако изтриете твърдо потребител, вероятно искате да изтриете и всички адреси на потребителя.)
  • може да SET NULL , което означава, изчистване на препращащия ключ. (Това може да има смисъл за нещо като file.last_modified_by . Ако изтриете твърдо потребител, може да искате последното модифицирано от файла да стане просто „неизвестно“.)

Ако посочите NO ACTION , казвате на InnoDB, че не искате той да предприема нито едно от тези действия. Така че InnoDB не може да поправи ситуацията вместо вас; всичко, което може да направи, е да отхвърли DELETE и върне грешка.

В резултат на това ON DELETE NO ACTION всъщност е същото като ON DELETE RESTRICT (по подразбиране).

(Забележка:в някои СУБД и в стандартния SQL, ON DELETE NO ACTION е малко по-различно от ON DELETE RESTRICT :в тези, ON DELETE NO ACTION означава "приемете DELETE в рамките на текущата транзакция, но отхвърля цялата транзакция, ако се опитам да я завърша, преди да коригирам проблема". Но InnoDB не поддържа отложени проверки, така че третира ON DELETE NO ACTION точно същото като ON DELETE RESTRICT и винаги отхвърля DELETE незабавно .)

Вижте §§14.2.2.5 "ВЪНШЕН КЛЮЧ Ограничения" и 13.1.17.2 "Използване на ограничения на FOREIGN KEY " в Справочното ръководство за MySQL 5.6.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql преместване на ред между таблици

  2. Настройка на отдалечена връзка с MySQL база данни

  3. Възможно ли е да се надстрои MySQL в MAMP до MySQL 5.7?

  4. SQL Показване на последния запис в GROUP BY?

  5. MySQL с MAMP не работи с OSX Yosemite 10.10