Posso adicionar uma restrição UNIQUE a uma tabela do PostgreSQL, depois que ela já foi criada?

185

Eu tenho a seguinte tabela:

 tickername | tickerbbname  | tickertype
------------+---------------+------------
 USDZAR     | USDZAR Curncy | C
 EURCZK     | EURCZK Curncy | C
 EURPLN     | EURPLN Curncy | C
 USDBRL     | USDBRL Curncy | C
 USDTRY     | USDTRY Curncy | C
 EURHUF     | EURHUF Curncy | C
 USDRUB     | USDRUB Curncy | C

Não quero que exista mais de uma coluna para qualquer par tickername/ dado tickerbbname. Já criei a tabela e tenho muitos dados (os quais já garanti que atendem aos critérios exclusivos). À medida que aumenta, porém, há espaço para erros.

Existe alguma maneira de adicionar uma UNIQUErestrição neste momento?

Thomas Browne
fonte

Respostas:

363

psqlda ajuda em linha:

\h ALTER TABLE

Também documentado nos documentos do postgres (um excelente recurso, além de fácil leitura também).

ALTER TABLE tablename ADD CONSTRAINT constraintname UNIQUE (columns);
hhaamu
fonte
6
obrigado @hhaamu. Sim, tentei os documentos, mas o seu acima é muito mais conciso.
28119 Thomas Browne
117
Se você deseja permitir que o PostgreSQL gere o nome do índice, use ALTER TABLE tablename ADD UNIQUE (columns);. (Note que a CONSTRAINTpalavra-chave deve ser omitido.)
jpmc26
5
Eu precisava de uma resposta para essa pergunta e comecei a pesquisar no Google Docs. Em vez da documentação do Postgres, encontrei este tópico no StackOverflow. Portanto, embora seja uma boa ideia fazer referência aos documentos oficiais, também é muito bom dar a resposta para futuras visitas. Obrigado por isso.
Leonard
@ jpmc26 «Se você deseja permitir que o PostgreSQL gere o nome do índice» Você quer dizer o nome da restrição?
Tuxayo #
4
@tuxayo, uma restrição única é implementada através de um índice no Postgres (para não ser pedante).
Chris W.
36

Sim você pode. Mas se você tiver entradas não exclusivas na sua tabela, ela falhará. Aqui está como adicionar restrições exclusivas à sua tabela. Se você estiver usando o PostgreSQL 9.x, siga as instruções abaixo.

CREATE UNIQUE INDEX constraint_name ON table_name (columns);
Zeck
fonte
3
Obrigado Zeck - agradável resposta mais tarde, mas ainda assim aprecio que as pessoas ainda tenham tempo! Tom
Thomas Browne
1
Isso não está correto. No Postgres mais recente, isso também leva à mensagem "Key (uuid) = (3a533772-07ac-4e76-b577-27a3878e2222) é duplicada. Falha na consulta" se você tiver um valor que não seja exclusivo ...
Strinder
3
@ Strinder, como isso não é uma coisa boa? corrija os dados duplicados primeiro.
Jasen
3
@ Jason Isso é totalmente claro. Só queria enfatizar que a resposta "Mas se você tiver entradas não exclusivas em sua tabela. Aqui está como adicionar restrições exclusivas em sua tabela". não funciona. Obviamente, entradas não exclusivas devem sempre ser consolidadas com antecedência.
Strinder
Editado a resposta para maior clareza
Xavier Ho
6

Se você tinha uma tabela que já tinha restrições existentes com base em digamos: nome e sobrenome e desejava adicionar mais uma restrição exclusiva, era necessário eliminar toda a restrição:

ALTER TABLE your_table DROP CONSTRAINT constraint_name;

Verifique se a nova restrição que você deseja adicionar é exclusiva / não nula (se for Microsoft Sql, pode conter apenas um valor nulo) em todos os dados dessa tabela e, em seguida, você pode recriá-la.

ALTER TABLE table_name
ADD CONSTRAINT constraint_name UNIQUE (column1, column2, ... column_n);
Lucas Campos
fonte
5

Sim, você pode adicionar uma restrição UNIQUE após o fato. No entanto, se você tiver entradas não exclusivas em sua tabela, o Postgres reclamará até que você as corrija.

Jordan S. Jones
fonte
7
select <column> from <table> group by 1 having count(*) > 1;fornecerá um relatório sobre valores duplicados.
Jasen