2009-07-28 35 views
97

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

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 

yo no quiero que haya cada vez más de una columna dada para cualquier tickername/tickerbbname par. Ya creé la tabla y tengo muchos datos (que ya garanticé que cumplen los criterios únicos). Sin embargo, a medida que se hace más grande, aumenta el margen de error.

¿Hay alguna manera de agregar una restricción UNIQUE en este punto?

+0

posible duplicado de [¿Cómo modificar una tabla de PostgreSQL y hago una columna única?] (Http://stackoverflow.com/questions/469471/how-do-i-alter-a-postgresql-table -y-make-a-column-unique) –

Respuesta

205

psql 's línea de ayuda:

\h ALTER TABLE 

también documentado en el postgres docs (un excelente recurso, más fácil de leer, también).

ALTER TABLE tablename ADD CONSTRAINT constraintname UNIQUE (columns); 
+1

gracias @hhaamu. Sí, probé los documentos, pero tu anterior es mucho más conciso. –

+54

Si desea dejar que PostgreSQL genere el nombre del índice, use 'ALTER TABLE tablename ADD UNIQUE (columns);'. (Tenga en cuenta que la palabra clave 'CONSTRAINT' debe omitirse.) – jpmc26

+2

Necesitaba una respuesta a esta 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

2

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

+3

'seleccione de

group by 1 having count (*)> 1;' dará un informe sobre los valores duplicados. – Jasen

25

Sí, puede hacerlo. Pero si tiene entradas no únicas en su mesa, fallará. Aquí está la forma de 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); 
+3

Gracias Zeck - ¡agradable respuesta 2y más tarde, pero todavía aprecio que la gente todavía se tome el tiempo! Tom –

+1

Eso no es correcto. En la última versión de Postgres esto también conduce al mensaje como "Clave (uuid) = (3a533772-07ac-4e76-b577-27a3878e2222) está duplicada. Consulta fallida" si tiene un valor que no es único ... – Strinder

+1

@ Strinder, ¿cómo es eso no es algo bueno? arregla los datos duplicados primero. – Jasen

0

Si tuviera una tabla que ya tenía unas limitaciones existentes sobre la base de que permite decir: nombre y apellido, y que quería añadir una más restricción única, había que dejar toda la restricción por:

ALTER TABLE your_table DROP CONSTRAINT constraint_name; 

Asegúrese de que la nueva restricción que desea agregar sea ú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); 
Cuestiones relacionadas