sql >> Databáze >  >> RDS >> Mysql

Proč používat cizí klíče bez akce na odstranění nebo aktualizaci

Myslím, že nerozumíte tomu, co ON DELETE NO ACTION prostředek. není znamená potlačit omezení cizího klíče.

Když smažete záznam, na který se odkazuje cizí klíč, InnoDB má možnost provést automatickou akci k nápravě situace:

  • může CASCADE , což znamená smazat odkazující záznam. (To by dávalo smysl pro něco jako user_address.user_id . Pokud uživatele natvrdo smažete, pravděpodobně budete chtít natvrdo smazat také všechny adresy tohoto uživatele.)
  • může SET NULL , což znamená, vymazat odkazující klíč. (To může mít smysl pro něco jako file.last_modified_by . Pokud uživatele natvrdo smažete, možná budete chtít, aby se poslední změna souboru jednoduše stala „neznámou“.)

Pokud zadáte NO ACTION , říkáte InnoDB, že nechcete, aby provedl žádnou z těchto akcí. Takže InnoDB nemůže situaci vyřešit za vás; vše, co může udělat, je odmítnout DELETE a vrátí chybu.

V důsledku toho ON DELETE NO ACTION je ve skutečnosti stejné jako ON DELETE RESTRICT (výchozí).

(Poznámka:v některých DBMS a ve standardním SQL ON DELETE NO ACTION se trochu liší od ON DELETE RESTRICT :v nich ON DELETE NO ACTION znamená „přijmout DELETE v rámci aktuální transakce, ale odmítnout celou transakci, pokud se ji pokusím potvrdit před nápravou problému." InnoDB však nepodporuje odložené kontroly, takže zachází s ON DELETE NO ACTION přesně stejné jako ON DELETE RESTRICT a vždy odmítá DELETE okamžitě .)

Viz §§14.2.2.5 "CIZI KLÍČ Omezení" a 13.1.17.2 "Použití omezení FOREIGN KEY " ." v Referenční příručce MySQL 5.6.



  1. Jak přidat indikátor AD/BC k datu v Oracle

  2. Sběr dat o výkonu pomocí nástroje SQLDiag | Odstraňování problémů s výkonem serveru SQL -6

  3. SQLite DROP TABLE

  4. MariaDB LENGTH() vs LENGTHB():Jaký je rozdíl?