¿Puedo agregar una restricción ÚNICA a una tabla PostgreSQL, después de que ya se haya creado?

185

Tengo la siguiente tabla:

 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

No quiero que haya más de una columna por cada par tickername/ tickerbbnamepar. Ya he creado la tabla y tengo muchos datos en ella (que ya he asegurado que cumple con los criterios únicos). Sin embargo, a medida que se hace más grande, el margen de error se arrastra.

¿Hay alguna manera de agregar una UNIQUErestricción en este momento?

Thomas Browne
fuente

Respuestas:

363

psqlAyuda en línea:

\h ALTER TABLE

También documentado en los documentos de postgres (un excelente recurso, además de fácil de leer).

ALTER TABLE tablename ADD CONSTRAINT constraintname UNIQUE (columns);
hhaamu
fuente
66
gracias @hhaamu. Sí, probé los documentos, pero lo anterior es mucho más conciso.
Thomas Browne
117
Si desea dejar que PostgreSQL genere el nombre del índice, use ALTER TABLE tablename ADD UNIQUE (columns);. (Tenga en cuenta que la CONSTRAINTpalabra clave debe omitirse).
jpmc26
55
Necesitaba una respuesta a esta misma pregunta y comencé a buscar en Google los documentos. En lugar de la documentación de Postgres, me encontré con este tema en StackOverflow. Entonces, aunque es una buena idea hacer referencia a los documentos oficiales, también es muy bueno dar la respuesta para futuras visitas. Gracias por eso.
Leonard
@ jpmc26 «Si quiere dejar que PostgreSQL genere el nombre del índice» ¿Se refiere al nombre de restricción?
tuxayo
44
@tuxayo, una restricción única se implementa a través de un índice en Postgres (para no ser pedante).
Chris W.
36

Sí tu puedes. Pero si tiene entradas no únicas en su tabla, fallará. Aquí se explica cómo agregar una restricción única en su tabla. Si está utilizando PostgreSQL 9.x, puede seguir las instrucciones a continuación.

CREATE UNIQUE INDEX constraint_name ON table_name (columns);
Zeck
fuente
3
Gracias Zeck: ¡respuesta agradable 2y más tarde pero aún así aprecio que la gente todavía se tome el tiempo! Tom
Thomas Browne
1
Eso no es correcto En los últimos Postgres, esto lleva también al mensaje como "Key (uuid) = (3a533772-07ac-4e76-b577-27a3878e2222) está duplicado. Consulta fallida" si tiene un valor que no es único ...
Strinder
3
@Strinder, ¿cómo es que eso no es bueno? corrija los datos duplicados primero.
Jasen
3
@Jasen Eso está totalmente claro. Solo quería enfatizar que la respuesta es "Pero si tiene entradas no únicas en su tabla. Aquí le mostramos cómo agregar restricciones únicas en su tabla". no trabajará. Por supuesto, las entradas no únicas siempre deben consolidarse de antemano.
Strinder
Editó la respuesta para mayor claridad
Xavier Ho
6

Si tenía una tabla que ya tenía restricciones existentes basadas en digamos: nombre y apellido y quería agregar una restricción única más, tenía que eliminar toda la restricción de la siguiente manera:

ALTER TABLE your_table DROP CONSTRAINT constraint_name;

Asegúrese de que la nueva restricción que desea agregar es única / no nula (si es Microsoft Sql, puede contener solo un valor nulo) en todos los datos de esa tabla, y luego puede volver a crearla.

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

Sí, puede agregar una restricción ÚNICA después del hecho. Sin embargo, si tiene entradas no únicas en su tabla, Postgres se quejará hasta que las corrija.

Jordan S. Jones
fuente
77
select <column> from <table> group by 1 having count(*) > 1;dará un informe sobre valores duplicados.
Jasen