Referential Actions
- are policies that define how a referenced record is handled by the database when you run an update or delete query
- are features of foreign key constraints that exist to preserve referential integrity in your database
Referential Actions (SQL 2003)
In the SQL 2003 standard there are 5 different referential actions:
CASCADE
ON DELETE CASCADEmeans that if the parent record is deleted, any child records are also deleted. This is not a good idea in my opinion. You should keep track of all data that’s ever been in a database, although this can be done usingTRIGGERs. (However, see caveat in comments below).ON UPDATE CASCADEmeans that if the parent primary key is changed, the child value will also change to reflect that. Again in my opinion, not a great idea. If you’re changingPRIMARY KEYs with any regularity (or even at all!), there is something wrong with your design. Again, see comments.ON UPDATE CASCADE ON DELETE CASCADEmeans that if youUPDATEORDELETEthe parent, the change is cascaded to the child. This is the equivalent ofANDing the outcomes of first two statements
RESTRICT
RESTRICTmeans that any attempt to delete and/or update the parent will fail throwing an error. This is the default behaviour in the event that a referential action is not explicitly specified.For an
ON DELETEorON UPDATEthat is not specified, the default action is always RESTRICT`.
NO ACTION
NO ACTION: From the manual. A keyword from standard SQL. In MySQL, equivalent toRESTRICT. The MySQL Server rejects the delete or update operation for the parent table if there is a related foreign key value in the referenced table. Some database systems have deferred checks, andNO ACTIONis a deferred check. In MySQL, foreign key constraints are checked immediately, soNO ACTIONis the same asRESTRICT.
SET NULL
SET NULL- again from the manual. Delete or update the row from the parent table, and set the foreign key column or columns in the child table toNULL. This is not the best of ideas IMHO, primarily because there is no way of “time-travelling” - i.e. looking back into the child tables and associating records withNULLs with the relevant parent record - eitherCASCADEor useTRIGGERs to populate logging tables to track changes (but, see comments).
SET DEFAULT
SET DEFAULT. Yet another (potentially very useful) part of the SQL standard that MySQL hasn’t bothered implementing! Allows the developer to specify a value to which to set the foreign key column(s) on an UPDATE or a DELETE. InnoDB and NDB will reject table definitions with aSET DEFAULTclause.