Différence entre les RESTREINDRE et AUCUNE ACTION n'

De documentation postgresql:

RESTREINDRE empêche la suppression d'une ligne référencée. AUCUNE ACTION signifie que si l'un de référencement de lignes existent encore lorsque la contrainte est activée, une erreur est générée; c'est le comportement par défaut si vous ne spécifiez rien. (La différence essentielle entre ces deux choix est qu'AUCUNE mesure ne permet de le vérifier pour être différé jusqu'à tard dans la transaction, alors que RESTREINDRE non).

Permet de le vérifier.
Créer de la mère et de l'enfant tableau:

CREATE TABLE parent (
  id serial not null,
  CONSTRAINT parent_pkey PRIMARY KEY (id)
);

CREATE TABLE child (
  id serial not null,
  parent_id serial not null,
  CONSTRAINT child_pkey PRIMARY KEY (id),
  CONSTRAINT parent_fk FOREIGN KEY (parent_id)
    REFERENCES parent (id) 
    ON DELETE NO ACTION
    ON UPDATE NO ACTION
);

Renseigner certaines données:

insert into parent values(1);
insert into child values(5, 1);

Et de test ne vérifie est vraiment différés:

BEGIN;
delete from parent where id = 1; -- violates foreign key constraint, execution fails
delete from child where parent_id = 1;
COMMIT;

Après avoir d'abord supprimer l'intégrité a été rompu, mais après la seconde, il serait restaurée. Toutefois, l'exécution échoue lors de la première supprimer.

Même pour la mise à jour:

BEGIN;
update parent set id = 2 where id = 1; -- same as above
update child set parent_id = 2 where parent_id = 1;
COMMIT;

En cas de suppressions, je peux échanger des déclarations pour le faire fonctionner, mais dans le cas de mises à jour je ne peux pas le faire (c'est achivable par la suppression de deux lignes et de l'insertion de nouvelles versions).

De nombreuses bases de données ne fais pas de différence entre les RESTREINDRE et qu'AUCUNE ACTION alors que postgres fait semblant de faire autrement. Est-elle (toujours) vrai?

OriginalL'auteur Jeriho | 2013-02-17