Comment promouvoir un index existant en clé primaire dans PostgreSQL

13

Je sais comment créer une clé primaire dans une table, mais comment faire d'un index existant une clé primaire? J'essaie de copier une table existante d'une base de données à une autre. Lorsque je montre le tableau, l'index en bas est sous cette forme:

"my_index" PRIMARY KEY, btree (column1, column2)

J'ai créé l'index avec:

CREATE INDEX my_index ON my_table (column1, column2)

Mais je ne sais pas comment en faire la clé primaire ...

MISE À JOUR: La version de mon serveur est 8.3.3

WildBill
la source
1
Si my_index apparaît comme le nom de la clé primaire , alors vous déjà avez un index. Il n'y a pas de PK sans index (unique) dans Postgres
a_horse_with_no_name
1
quelle est votre version de PostgreSQL?
filiprem
Je cours 8.3.3
WildBill

Réponses:

16

Vous utiliseriez ALTER TABLE pour ajouter la contrainte de clé primaire . Dans Postgres, vous pouvez "promouvoir" un index en utilisant le ALTER TABLE .. ADD table_constraint_using_indexformulaire " "

Remarque, l'index doit bien sûr être unique pour une clé primaire

ALTER TABLE my_table 
    ADD CONSTRAINT PK_my_table PRIMARY KEY USING INDEX my_index;
gbn
la source
Cela n'a pas fonctionné pour moi. Qu'est-ce que PK_my_table? Je suppose que c'est une étiquette et j'ajoute «PK_» au nom de ma table? J'ai une erreur de syntaxe disant "ERREUR: erreur de syntaxe à ou près de" USING "au caractère 83"
WildBill
1
@ngramsky: USING INDEXest disponible depuis la 9.1. Donc je suppose que vous
n'utilisez
Non, j'utilise la 8.3.3. Comment pourrais-je procéder en 8.3.3?
WildBill
5
La seule façon de le faire dans cette ancienne version est de supprimer l'index et d'ajouter une nouvelle contrainte pk.
a_horse_with_no_name
2
@a_horse_with_no_name: vous devriez en faire une réponse: votre commentaire est antérieur à l'autre réponse ...
gbn
7

Je ne pense pas qu'il soit possible de convertir un index en clé primaire dans cette version de postgresql.

Je voudrais simplement supprimer l'index existant et créer la clé primaire en utilisant les colonnes que vous avez spécifiées .:

DROP INDEX my_index;
ALTER TABLE ONLY my_table ADD CONSTRAINT pk_my_table PRIMARY KEY(column1,column2);

A travaillé en 7.4 et 8.4

Craig Efrein
la source
btw, "Si SEUL est spécifié avant le nom de la table, seule cette table est modifiée. Si SEUL n'est pas spécifié, la table et toutes ses tables descendantes (le cas échéant) sont modifiées."
Paolo