2012-06-13 9 views
7

Vorrei trovare un modo per archiviare più indirizzi per un argomento nel mio database, con un solo indirizzo predefinito per argomento.Postgres Unique Constraint su due colonne: Integer e Boolean

Per tagliare una lunga storia breve, consente di dire che abbiamo un tavolo:

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

per ogni ID nella tabella, ci deve essere al massimo 1 vero valore attivo.

Come posso ottenere questo risultato?

Grazie.

+0

In realtà non devi fare * qualsiasi cosa * poiché 'id' essendo la chiave primaria lo rende unico così * non * può * essere due righe con lo stesso ID. – ThiefMaster

+0

Se non si desidera che 'id' sia come primario, è necessario scrivere un trigger: http://www.postgresql.org/docs/9.1/static/sql-createtrigger.html ma questo probabilmente non è ciò che si desidera. –

risposta

11

Partial index è ciò che si vuole:

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

Come @ThiefMaster afferma indice primario deve essere rimosso.

+0

Grazie. Questo va bene perché il mio PK è l'indirizzo PK in questa tabella. Funziona anche: CREATE UNIQUE INDEX some_index ON test UTILIZZO btree (attivo, id) DOVE attivo; – greatkalu

+0

Dovresti notare che l'unica cosa veramente cambiata nella tua query è l'aggiunta attiva all'indice. Mentre attivo è sempre vero per tutti i campi che un soggetto per l'indicizzazione hai appena aggiunto un po 'gonfio. – kworr

+1

PK è solo una somma di vincoli UNIQUE e NOT NULL. – kworr

3

Nel caso di questa domanda non è necessario come spiegato in precedenza.

Ma FYI, è possibile impostare i vincoli su 2 o più colonne (non PrimaryKey) con tipi diversi. Per esempio:

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

Per ulteriori informazioni, vedere il doc Postgres per Constraints, la sezione "vincoli univoci". Per citare:

Se un vincolo univoco riferisce ad un gruppo di colonne, le colonne sono elencate separate da virgole ...

Questo specifica che la combinazione dei valori nelle colonne indicate è unico lungo l'intera tabella, sebbene nessuna delle colonne non debba essere (e normalmente non lo è) unica.

Nota: Un partial index imposta un indice costruita su un sottoinsieme di una tabella, che ha uno scopo completamente diverso.

+0

Penso che con la tua soluzione non possa avere più indirizzi non attivi. – Hossein

Problemi correlati