2015-12-23 25 views
1

在PostgreSQL(9.2),我有一個表:如何創建一個時間戳的日期的唯一約束

tservice   timestamp without time zone NOT NULL, 
    patient_recid integer NOT NULL 

我想在日期tservice的創建一個唯一約束,東西如:

constraint service_unique UNIQUE (patient_recid, tservice::date) 

它會在日期轉換時產生語法錯誤。

在PostgreSQL中如何做到最好?

TIA

+1

不能創建一個表達式的約束。你需要使用一個獨特的*索引* –

+0

@a_horse_with_no_name會嘗試。謝謝。 –

回答

3

奇怪,似乎PostgreSQL允許只在唯一約束列,但表達式在這裏是不允許的。

您可以創建一個獨特的功能指數(作爲一種解決方法),表達式索引是從9.1版本支持:

create unique index service_unique 
ON table_name(patient_recid, date_trunc('day',tservice)); 
1

創建約束時無法投射tservice。

如果應用於tservice的約束作爲「日期」類型,您可以創建tservice列作爲類型​​「date」。

您可以更新的列是這樣的類型:

ALTER TABLE your_table ALTER COLUMN tservice TYPE date; 

然後添加約束,像這樣:

ALTER TABLE your_table ADD CONSTRAINT service_unique UNIQUE (patient_recid, tservice) 
2

如前所述,UNIQUE INDEX工作得很好。 對於那些誰獲得了「索引表達式函數必須註明IMMUTABLE」的錯誤,你可以修復時區在索引:

CREATE UNIQUE INDEX service_unique ON table_name(patient_recid, date_trunc('day',tservice AT TIME ZONE 'GMT'));