web-dev-qa-db-fra.com

Est-ce que FK sur la mise à jour des travaux de cascade?

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.

6
ted.strauss

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).

7
ypercubeᵀᴹ