Intuitivement, l'ajout de l'option sur la mise à jour de la cascade à une contrainte de clé étrangère aura l'effet de mettre à jour toutes les colonnes de référencement avec la valeur mise à jour de la clé. Cela fonctionnerait-il vraiment?
Exemple soulevé du manuel :
CREATE TABLE products (
product_no integer PRIMARY KEY,
name text,
price numeric
);
CREATE TABLE orders (
order_id integer PRIMARY KEY,
shipping_address text,
...
);
CREATE TABLE order_items (
product_no integer REFERENCES products ON DELETE RESTRICT,
## HERE'S THE LINE THAT I MODIFIED FROM THE MANUAL, IT USED TO SAY 'ON DELETE CASCADE'
order_id integer REFERENCES orders ON UPDATE CASCADE,
quantity integer,
PRIMARY KEY (product_no, order_id)
);
J'utilise Postgres 9.1.
Options possibles pour le ON DELETE
Et ON UPDATE
Les clauses sont expliquées dans le CREATE TABLE
page du manuel.
La valeur par défaut est NO ACTION
, Donc si vous avez des clés étrangères définies sans spécifier explicitement quelle action à effectuer sur les mises à jour de la clé primaire référencée ou unique, elle est la même que si ON UPDATE NO ACTION
:
NO ACTION
Produire une erreur indiquant que la suppression ou la mise à jour créerait une violation de la contrainte de clé étrangère. Si la contrainte est différée, cette erreur sera produite lors du délai de vérification des contraintes s'il existe des lignes de référencement. Ceci est l'action par défaut.
Si vous avez spécifié ON UPDATE CASCADE
Sur une clé étrangère, les lignes de référencement seront mises à jour en conséquence lorsqu'une ligne référencée est mise à jour:
CASCADE
Supprimez toutes les lignes référencées de la ligne supprimée ou mettez à jour la valeur de la colonne de référencement à la nouvelle valeur de la colonne référencée, respectivement.
Les clés primaires ne sont généralement pas mises à jour (et pour de bonnes raisons), mais il existe des situations où il peut être utile. De plus, la clé étrangère peut être référencée non une clé primaire, mais une clé unique (rarement mise à jour).