- Restricting and cascading deletes are the two most common options.
- RESTRICT prevents deletion of a
- referenced row. NO ACTION means that if any
- referencing rows still exist when the constraint is checked, an error
- is raised; this is the default behavior if you do not specify anything.
- (The essential difference between these two choices is that
- NO ACTION allows the check to be deferred until
- later in the transaction, whereas RESTRICT does not.)
+ The default ON DELETE action is ON DELETE NO
+ ACTION; this does not need to be specified. This means that the
+ deletion in the referenced table is allowed to proceed. But the
+ foreign-key constraint is still required to be satisfied, so this
+ operation will usually result in an error. But checking of foreign-key
+ constraints can also be deferred to later in the transaction (not covered
+ in this chapter). In that case, the NO ACTION setting
+ would allow other commands to fix
the situation before the
+ constraint is checked, for example by inserting another suitable row into
+ the referenced table or by deleting the now-dangling rows from the
+ referencing table.
+
+
+ RESTRICT is a stricter setting than NO
+ ACTION. It prevents deletion of a referenced row.
+ RESTRICT does not allow the check to be deferred until
+ later in the transaction.
+
+
CASCADE specifies that when a referenced row is deleted,
row(s) referencing it should be automatically deleted as well.
+
+
There are two other options:
SET NULL and SET DEFAULT.
These cause the referencing column(s) in the referencing row(s)
NULL and SET DEFAULT.
In this case, CASCADE means that the updated values of the
referenced column(s) should be copied into the referencing row(s).
+ There is also a noticeable difference between ON UPDATE NO
+ ACTION (the default) and NO UPDATE RESTRICT.
+ The former will allow the update to proceed and the foreign-key constraint
+ will be checked against the state after the update. The latter will
+ prevent the update to run even if the state after the update would still
+ satisfy the constraint. This prevents updating a referenced row to a
+ value that is distinct but compares as equal (for example, a character
+ string with a different case variant, if a character string type with a
+ case-insensitive collation is used).
clause specifies the action to perform when a referenced column
in the referenced table is being updated to a new value. If the
row is updated, but the referenced column is not actually
- changed, no action is done. Referential actions other than the
- NO ACTION check cannot be deferred, even if
- the constraint is declared deferrable. There are the following possible
- actions for each clause:
+ changed, no action is done. Referential actions are executed as part of
+ the data changing command, even if the constraint is deferred. There
+ are the following possible actions for each clause:
NO ACTION
- Produce an error indicating that the deletion or update
+ Produce an error if the deletion or update
would create a foreign key constraint violation.
If the constraint is deferred, this
error will be produced at constraint check time if there still
RESTRICT
- Produce an error indicating that the deletion or update
- would create a foreign key constraint violation.
- This is the same as NO ACTION except that
- the check is not deferrable.
+ Produce an error if a row to be deleted or updated matches a row in
+ the referencing table. This prevents the action even if the state
+ after the action would not violate the foreign key constraint. In
+ particular, it prevents updates of referenced rows to values that
+ are distinct but compare as equal. (But it does not prevent
+ no-op
updates that update a column to the same
+ value.)