En Postgresql, fuerza única en combinación de dos columnas

192

Me gustaría configurar una tabla en PostgreSQL para que dos columnas juntas sean únicas. Puede haber múltiples valores de cualquier valor, siempre que no haya dos que compartan ambos.

Por ejemplo:

CREATE TABLE someTable (
    id int PRIMARY KEY AUTOINCREMENT,
    col1 int NOT NULL,
    col2 int NOT NULL
)

Entonces, col1y col2puede repetir, pero no al mismo tiempo. Entonces, esto estaría permitido (sin incluir la identificación)

1 1
1 2
2 1
2 2

pero no esto:

1 1
1 2
1 1 -- would reject this insert for violating constraints
PearsonArtPhoto
fuente
Como este es un resultado de búsqueda de alto rango en Google, tal vez sea mejor proporcionar también una tabla
alternativa

Respuestas:

228
CREATE TABLE someTable (
    id serial primary key,
    col1 int NOT NULL,
    col2 int NOT NULL,
    unique (col1, col2)
)

autoincrementno es postgresql. Quieres un serial.

Si col1 y col2 hacen un único y no pueden ser nulos, entonces son una buena clave primaria:

CREATE TABLE someTable (
    col1 int NOT NULL,
    col2 int NOT NULL,
    primary key (col1, col2)
)
Clodoaldo Neto
fuente
66
Me gusta la sugerencia de una clave primaria sobre única aquí, porque no permitimos valores NULL en este caso. A partir de los documentos PostgeSQL: "Tenga en cuenta que una restricción única no, por sí mismo, proporciona un identificador único, ya que no excluye los valores nulos)." Postgresql.org/docs/8.1/static/ddl-constraints.html#AEN2038
ndequeker
¿Cómo puedo implementar esto en la definición de esquema?
Wagng
2
En algunos escenarios, es posible que desee utilizar una clave sustituta como clave principal en lugar de una combinación de columnas. En particular para mejorar el rendimiento al hacer uniones en grandes volúmenes de datos. Yo personalmente elegí la solución de RESTRICCIÓN ÚNICA a continuación.
Alexis.Rolland
1
¿Es posible imponer una restricción única en una sola permutación, como unique (col1, col2 = '1')?
Vikram Khemlani
160

Cree una restricción única de que dos números juntos NO PUEDEN repetirse juntos:

ALTER TABLE someTable
ADD UNIQUE (col1, col2)
djangojazz
fuente
18

Parece una RESTRICCIÓN ÚNICA regular :)

CREATE TABLE example (
a integer,
b integer,
c integer,
UNIQUE (a, c));

Más aquí

Timur Sadykov
fuente
1
¿Esto agrega un índice para ay un índice para cindependientemente? Porque necesito encontrar rápidamente basado en aalgunas veces, y encontrar rápidamente basado en calgunas veces.
CMCDragonkai