sql >> Database >  >> RDS >> Mysql

Waarom externe sleutels gebruiken zonder actie op verwijderen of bijwerken?

Ik denk dat je niet begrijpt wat ON DELETE NO ACTION middelen. Het doet niet bedoel om de externe-sleutelbeperking te onderdrukken.

Wanneer u een record verwijdert waarnaar wordt verwezen met een externe sleutel, heeft InnoDB de mogelijkheid om een ​​automatische actie te ondernemen om de situatie te corrigeren:

  • het kan CASCADE , wat betekent:verwijder het verwijzende record. (Dit zou logisch zijn voor iets als user_address.user_id . Als u een gebruiker definitief verwijdert, wilt u waarschijnlijk ook alle adressen van de gebruiker definitief verwijderen.)
  • het kan SET NULL , wat betekent:verwijder de verwijzende sleutel. (Dit kan logisch zijn voor iets als file.last_modified_by . Als u een gebruiker definitief verwijdert, wilt u misschien dat de laatste wijziging van het bestand gewoon "onbekend" wordt.)

Als u NO ACTION opgeeft , vertel je InnoDB dat je niet wilt dat het een van deze acties onderneemt. Dus InnoDB kan de situatie niet voor je oplossen; het enige wat het kan doen is de DELETE . weigeren en een fout terugsturen.

Dientengevolge, ON DELETE NO ACTION is eigenlijk hetzelfde als ON DELETE RESTRICT (de standaard).

(Opmerking:in sommige DBMS-en, en in standaard SQL, ON DELETE NO ACTION is een beetje anders dan ON DELETE RESTRICT :in die, ON DELETE NO ACTION betekent "accepteer de DELETE binnen de huidige transactie, maar weiger de hele transactie als ik probeer deze vast te leggen voordat ik het probleem verhelp". Maar InnoDB ondersteunt geen uitgestelde controles, dus behandelt het ON DELETE NO ACTION precies hetzelfde als ON DELETE RESTRICT , en verwerpt altijd de DELETE onmiddellijk .)

Zie §§14.2.2.5 "BUITENLANDSE SLEUTEL beperkingen" en 13.1.17.2 "BUITENLANDSE KEY-beperkingen gebruiken " in de MySQL 5.6 Referentiehandleiding.



  1. Selecteer hoofdletterongevoelig met mysql, php en pdo

  2. MySQL:vat alle rijtellingen van tabellen samen in één enkele query

  3. Rails ActiveRecord verwerkt een id-kolom die niet de primaire sleutel is

  4. Rails:Postgres-toestemming geweigerd om database op rake te maken db:create:all