2012-06-13 22 views
7

Me gustaría encontrar una forma de almacenar varias direcciones para un tema en mi base de datos, con solo una dirección predeterminada por tema.Postgres Restricción única en dos columnas: Entero y booleano

para cortar una larga historia corta, digamos que tenemos una tabla:

CREATE TABLE test 
(
    id integer NOT NULL, 
    active boolean NOT NULL, 
    CONSTRAINT pk_id PRIMARY KEY (id) 
) 

para cada ID de la tabla, debe ser como máximo de 1 verdadero valor activo.

¿Cómo puedo lograr esto?

Gracias.

+0

En realidad no tiene que hacer * nada * ya que 'id' es la clave principal lo hace único así que * no * puede haber dos filas con la misma ID. – ThiefMaster

+0

Si no quiere 'id' como primario, entonces deberá escribir un disparador: http://www.postgresql.org/docs/9.1/static/sql-createtrigger.html pero probablemente no sea lo que quiere. –

Respuesta

11

Partial index es lo que quiere:

create unique index some_index on test (id) where active; 

Como afirma @ThiefMaster índice primario debe ser eliminado.

+0

Gracias. Eso está bien porque mi PK es la dirección PK en esta tabla. Esto también funciona: CREATE UNIQUE INDEX some_index ON test USANDO btree (activo, id) DONDE está activo; – greatkalu

+0

Debería notar que lo único que realmente ha cambiado en su consulta es agregar activo al índice. Mientras que activo siempre es cierto para todos los campos que un sujeto para indexar acaba de agregar algo de hinchazón. – kworr

+1

PK es solo una suma de restricciones ÚNICA y NO NULA. – kworr

3

En el caso de esta pregunta no es necesario como se explicó anteriormente.

Pero, para su información, puede establecer restricciones para 2 o más columnas (no principales) con diferentes tipos. Por ejemplo:

ALTER TABLE table_name ADD CONSTRAINT constraint_name UNIQUE (integer_column, boolean_column); 

Para obtener más información, véase el documento de Postgres para Constraints, la sección "Restricciones de unicidad". Para citar:

Si una restricción única se refiere a un grupo de columnas, las columnas se enumeran separados por comas ...

Esto especifica que la combinación de los valores en las columnas indicadas es único en toda la mesa, aunque ninguna de las columnas necesita ser (y normalmente no es) única.

Nota: Un partial index establece un índice construido sobre un subconjunto de una tabla, la cual tiene un propósito completamente diferente.

+0

Creo que con su solución no puede tener múltiples direcciones no activas. – Hossein

Cuestiones relacionadas