Come promuovere un indice esistente come chiave primaria in PostgreSQL


13

So come rendere una chiave primaria all'interno di una tabella, ma come faccio a rendere un indice esistente una chiave primaria? Sto cercando di copiare una tabella esistente da un database a un altro. Quando mostro la tabella, l'indice in basso è in questa forma:

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

Ho creato l'indice con:

CREATE INDEX my_index ON my_table (column1, column2)

Ma non so come renderlo la chiave primaria ...

AGGIORNAMENTO: la versione del mio server è 8.3.3


1
Se my_index è mostrato come il nome della chiave primaria allora hai già dispone di un indice. Non esiste un PK senza un indice (unico) in Postgres
a_horse_with_no_name

1
qual è la tua versione PostgreSQL?
filiprem,

Sono in esecuzione 8.3.3
WildBill il

Risposte:


16

Utilizzare ALTER TABLE per aggiungere il vincolo chiave primaria . In Postgres puoi "promuovere" un indice usando il ALTER TABLE .. ADD table_constraint_using_indexmodulo " "

Nota, l'indice deve ovviamente essere unico per una chiave primaria

ALTER TABLE my_table 
    ADD CONSTRAINT PK_my_table PRIMARY KEY USING INDEX my_index;

Non ha funzionato per me. Che cos'è PK_my_table? Presumo che questa sia un'etichetta e aggiungo 'PK_' al nome della mia tabella? Ho ricevuto un errore di sintassi che diceva "ERRORE: errore di sintassi vicino o" USANDO "al carattere 83"
WildBill,

1
@ngramsky: USING INDEXè disponibile dal 9.1. Quindi suppongo che tu non stia eseguendo la versione corrente
a_horse_with_no_name

No, sto usando 8.3.3 Come potrei fare per farlo in 8.3.3?
WildBill il

5
L'unico modo per farlo in quella versione antica è di eliminare l'indice e aggiungere un nuovo vincolo pk.
a_horse_with_no_name il

2
@a_horse_with_no_name: dovresti dare una risposta: il tuo commento precede l'altra risposta ...
gbn

7

Non credo sia possibile convertire un indice in una chiave primaria in quella versione di postgresql.

Vorrei semplicemente rilasciare l'indice esistente e creare la chiave primaria utilizzando le colonne specificate .:

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

Ha funzionato in 7.4 e 8.4


tra l'altro, "Se viene specificato SOLO prima del nome della tabella, viene modificata solo quella tabella. Se non viene specificato SOLO, la tabella e tutte le sue tabelle discendenti (se presenti) vengono modificate."
Paolo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.