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


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;

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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.