Cómo promover un índice existente a clave principal en PostgreSQL

13

Sé cómo hacer una clave primaria dentro de una tabla, pero ¿cómo hago para que un índice existente sea una clave primaria? Estoy tratando de copiar una tabla existente de una base de datos a otra. Cuando muestro la tabla, el índice en la parte inferior está en esta forma:

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

He creado el índice con:

CREATE INDEX my_index ON my_table (column1, column2)

Pero no sé cómo convertirlo en la clave principal ...

ACTUALIZACIÓN: La versión de mi servidor es 8.3.3

WildBill
fuente
1
Si my_index se muestra como el nombre de la clave primaria, entonces ya tiene un índice. No hay PK sin un índice (único) en Postgres
a_horse_with_no_name
1
¿Cuál es su versión de PostgreSQL?
filiprem
Estoy ejecutando 8.3.3
WildBill

Respuestas:

16

Usaría ALTER TABLE para agregar la restricción de clave principal . En Postgres puedes "promocionar" un índice usando el ALTER TABLE .. ADD table_constraint_using_indexformulario " "

Tenga en cuenta que el índice debe ser único, por supuesto, para una clave primaria

ALTER TABLE my_table 
    ADD CONSTRAINT PK_my_table PRIMARY KEY USING INDEX my_index;
gbn
fuente
Eso no me funcionó. ¿Qué es PK_my_table? ¿Asumo que esto es una etiqueta y agrego 'PK_' al nombre de mi tabla? Recibí un error de sintaxis que decía "ERROR: error de sintaxis en o cerca de" USING "en el personaje 83"
WildBill
1
@ngramsky: USING INDEXestá disponible desde 9.1. Así que supongo que no estás ejecutando la versión actual
a_horse_with_no_name
No, estoy usando 8.3.3 ¿Cómo haría eso en 8.3.3?
WildBill
55
La única forma de hacerlo en esa versión antigua es soltar el índice y agregar una nueva restricción pk.
a_horse_with_no_name
2
@a_horse_with_no_name: debe responder eso: su comentario es anterior a la otra respuesta ...
gbn
7

No creo que sea posible convertir un índice en una clave primaria en esa versión de postgresql.

Simplemente soltaría el índice existente y crearía la clave primaria usando las columnas que especificó:

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

Trabajó en 7.4 y 8.4

Craig Efrein
fuente
por cierto, "Si SOLO se especifica antes del nombre de la tabla, solo se modifica esa tabla. Si SOLO no se especifica, la tabla y todas sus tablas descendientes (si las hay) se alteran".
Paolo