-
Encryption
-
Data integrity
-
Normalization
-
Materialized views
EXPLANATION
In the SQL 2003 standard there are 5 different referential actions:
- CASCADE
- RESTRICT
- NO ACTION
- SET NULL
- SET DEFAULT
To answer the question:
- CASCADE
ON DELETE CASCADE
means 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 using TRIGGER
s. (However, see caveat in comments below).
ON UPDATE CASCADE
means 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 changing PRIMARY KEY
s with any regularity (or even at all!), there is something wrong with your design. Again, see comments.
ON UPDATE CASCADE ON DELETE CASCADE
means that if you UPDATE
OR DELETE
the parent, the change is cascaded to the child. This is the equivalent of AND
ing the outcomes of first two statements.
- RESTRICT
RESTRICT
means 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 DELETE
or ON UPDATE
that is not specified, the default action is always RESTRICT`.
- NO ACTION
NO ACTION
: From the manual. A keyword from standard SQL. In MySQL, equivalent to RESTRICT
.
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, and NO ACTION
is a deferred check. In MySQL, foreign key constraints are checked immediately, so NO ACTION
is the same as RESTRICT
.
- 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 to NULL
. 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 with NULL
s with the relevant parent record - either CASCADE
or use TRIGGER
s 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 a SET DEFAULT
clause.
As mentioned above, you should spend some time looking at the documentation,
here.
0 comments:
Post a Comment