2012-06-13 61 views
7

我想找到一種方法來爲我的數據庫中的一個主題存儲多個地址,每個主題只有一個默認地址。Postgres在兩列上的唯一約束:整數和布爾值

爲了削減長話短說,假設我們有一個表:

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

對於表中的每個ID,必須有最真實的1活躍值。

我怎麼能做到這一點?

謝謝。

+0

其實你不需要做任何*因爲'id'是主鍵使它獨一無二,所以*不能*是具有相同ID的兩行。 – ThiefMaster

+0

如果你不想'id'作爲主要的,那麼你將需要編寫一個觸發器:http://www.postgresql.org/docs/9.1/static/sql-createtrigger.html但這可能不是你想要的。 –

回答

11

Partial index是你想要什麼:

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

由於@ThiefMaster規定的主要指標應該被刪除。

+0

謝謝。這很好,因爲我的PK是該表中的地址PK。這也適用:CREATE UNIQUE INDEX some_index ON test USING btree (active,id) WHERE active; – greatkalu

+0

您應該注意到,您查詢中唯一真正改變的是將活動添加到索引。儘管對於索引主題的所有字段而言,主動總是正確的,但您只是添加了一些膨脹。 – kworr

+1

PK只是UNIQUE和NOT NULL約束的總和。 – kworr

3

在這個問題的情況下,不需要如前所述。

但是僅供參考,您可以使用將約束條件設置爲2個或更多(不同類型的非主鍵)列。例如:

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

欲瞭解更多信息,請參閱Postgres的文檔爲Constraints,「唯一約束」部分。引述:

如果一個唯一約束是指一組列,列列由逗號分隔...

此規定,在指定的列值的組合在整個表獨特的,儘管任何一列不一定是(並且通常不是)唯一的。

注: 一個partial index將建立在一個表,其中有一個完全不同的目的的一個子集的索引。

+0

我認爲你的解決方案,他不能有多個非活動地址。 – Hossein