Como promover um índice existente para a chave primária no PostgreSQL

13

Eu sei como criar uma chave primária em uma tabela, mas como faço para tornar um índice existente uma chave primária? Estou tentando copiar uma tabela existente de um banco de dados para outro. Quando mostro a tabela, o índice na parte inferior está neste formato:

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

Eu criei o índice com:

CREATE INDEX my_index ON my_table (column1, column2)

Mas eu não sei como torná-lo a chave primária ...

ATUALIZAÇÃO: A versão do meu servidor é 8.3.3

WildBill
fonte
1
Se my_index for mostrado como o nome da chave primária, você já terá um índice. Não há PK sem um índice (original) em Postgres
a_horse_with_no_name
1
qual é a sua versão do PostgreSQL?
Filipem
Estou executando o 8.3.3
WildBill 14/12

Respostas:

16

Você usaria ALTER TABLE para adicionar a restrição de chave primária . No Postgres, você pode "promover" um índice usando o ALTER TABLE .. ADD table_constraint_using_indexformulário " "

Observe que o índice precisa ser exclusivo, é claro, para uma chave primária

ALTER TABLE my_table 
    ADD CONSTRAINT PK_my_table PRIMARY KEY USING INDEX my_index;
gbn
fonte
Isso não funcionou para mim. O que é PK_my_table? Presumo que este seja um rótulo e acrescento 'PK_' ao nome da minha tabela? Eu recebi um erro de sintaxe dizendo "ERRO: erro de sintaxe no ou próximo a" USING "no caractere 83"
WildBill 6/11/11
1
@ ngramsky: USING INDEXestá disponível desde 9.1. Então eu acho que você não está executando a versão atual
a_horse_with_no_name 14/12/11
Não, estou usando o 8.3.3. Como eu faria isso no 8.3.3?
WildBill
5
A única maneira de fazer isso nessa versão antiga é soltar o índice e adicionar uma nova restrição de pk.
a_horse_with_no_name
2
@a_horse_with_no_name: você deve fazer disso uma resposta: seu comentário antecede a outra resposta ...
gbn
7

Eu não acho que é possível converter um índice em uma chave primária nessa versão do postgresql.

Gostaria apenas de soltar o índice existente e criar a chave primária usando as colunas que você especificou .:

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

Trabalhou em 7.4 e 8.4

Craig Efrein
fonte
btw, "Se ONLY for especificado antes do nome da tabela, somente essa tabela será alterada. Se ONLY não for especificado, a tabela e todas as suas tabelas descendentes (se houver) serão alteradas."
Paolo