Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Dlaczego używać kluczy obcych bez żadnych działań przy usuwaniu lub aktualizowaniu?

Myślę, że nie rozumiesz, co ON DELETE NO ACTION znaczy. nie oznacza pominięcie ograniczenia klucza obcego.

Po usunięciu rekordu, do którego odwołuje się klucz obcy, InnoDB ma możliwość podjęcia automatycznej akcji w celu naprawienia sytuacji:

  • może CASCADE , co oznacza, usuń rekord odsyłający. (To miałoby sens w przypadku czegoś takiego jak user_address.user_id . Jeśli na stałe usuniesz użytkownika, prawdopodobnie chcesz również na stałe usunąć wszystkie adresy użytkownika.)
  • może SET NULL , co oznacza, usuń klucz odsyłający. (Może to mieć sens w przypadku czegoś takiego jak file.last_modified_by . Jeśli na stałe usuniesz użytkownika, możesz chcieć, aby ostatnia modyfikacja pliku stała się po prostu "nieznana".)

Jeśli określisz NO ACTION , mówisz InnoDB, że nie chcesz, aby wykonywała ona żadne z tych działań. Więc InnoDB nie może naprawić sytuacji za Ciebie; wszystko, co może zrobić, to odrzucić DELETE i zwróć błąd.

W rezultacie ON DELETE NO ACTION jest w rzeczywistości tym samym, co ON DELETE RESTRICT (domyślnie).

(Uwaga:w niektórych DBMS i w standardowym SQL, ON DELETE NO ACTION różni się nieco od ON DELETE RESTRICT :w tych, ON DELETE NO ACTION oznacza "zaakceptuj DELETE w ramach bieżącej transakcji, ale odrzuć całą transakcję, jeśli spróbuję ją zatwierdzić przed naprawieniem problemu”. Ale InnoDB nie obsługuje odroczonych kontroli, więc traktuje ON DELETE NO ACTION dokładnie tak samo jak ON DELETE RESTRICT i zawsze odrzuca DELETE natychmiast .)

Zobacz §§14.2.2.5 „KLUCZ OBCY Ograniczenia” i 13.1.17.2 "Korzystanie z ograniczeń KLUCZA OBCEGO w podręczniku MySQL 5.6 Reference Manual.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dane kolumny tabeli przestawnej MySQL w postaci wierszy

  2. phpMyAdmin zgłasza #2002 nie można zalogować się do serwera mysql phpmyadmin

  3. Jak zdefiniować niestandardowe zamówienie ORDER BY w mySQL?

  4. Klucz obcy MySQL, aby umożliwić NULL?

  5. Jak wstawić ciąg do innego ciągu w MySQL za pomocą INSERT()