web-dev-qa-db-fra.com

Comment modifier "REFERENCES" dans PostgreSQL?

Comment puis-je modifier la référence à une table dans PostgreSQL lorsque le nom de la table a été modifié?

Dis que j'ai:

CREATE TABLE example1 (
   id serial NOT NULL PRIMARY KEY,
   name varchar(100)
);

CREATE TABLE example2 (
   id serial NOT NULL PRIMARY KEY,
   example1fk integer REFERENCES example1 (id) DEFERRABLE INITIALLY DEFERRED
);

Plus tard, je fais:

ALTER TABLE example1 RENAME TO example3; 

Comment changer la définition de la contrainte de clé étrangère?

example1fk integer REFERENCES example1 (id) DEFERRABLE INITIALLY DEFERRED,
22

Les dépendances internes entre les tables et/ou d'autres objets ne sont jamais liées au nom de l'objet. En interne, chaque objet est stocké dans des tables de catalogue et le OID (clé primaire interne) de l'objet est utilisé pour tout sinon.

En conséquence, un FOREIGN KEY la référence est stockée dans les tables du catalogue pg_constraint et pg_depend . La modification des noms de table n'affectera en rien la fonctionnalité .

Le nom de la contrainte reste inchangé. Vous pouvez ignorer cela ou vous pouvez renommer la contrainte afin qu'elle ne soit pas trompeuse.

Cependant, comme vous n'avez pas spécifié de nom de contrainte au moment de la création, le système a choisi une valeur par défaut, qui est example2_example1fk_fkey dans votre cas, sauf si le nom a été pris. Aucune référence au nom table référencé. Mais le nom de la colonne devra probablement changer dans votre exemple également. Et ça est utilisé dans le nom de la contrainte.

ALTER TABLE example2 RENAME example1fk TO example3fk;  -- rename column

Dans Postgres 9.2 ou version ultérieure, vous pouvez également renommer la contrainte (ainsi que commenté par le dequis ):

ALTER TABLE example2 RENAME CONSTRAINT example2_example1fk_fkey TO example2_example3fk_fkey;

Dans les anciennes versions, vous devez supprimer et recréer la contrainte pour la renommer, mieux en une seule instruction:

ALTER TABLE example2  -- rename constraint
   DROP CONSTRAINT example2_example1fk_fkey
 , ADD  CONSTRAINT example2_example3fk_fkey FOREIGN KEY (example3fk)
      REFERENCES example3 (id) DEFERRABLE INITIALLY DEFERRED;

Détails dans le manuel.

26
Erwin Brandstetter