如何在时间戳的日期创建唯一约束

时间:2015-12-23 16:27:11

标签: database postgresql

在postgresql(9.2)中,我有一个表格:

std::unique_ptr

我希望在tservice的 date 上创建一个唯一约束,例如:

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

在日期转换时产生语法错误。

如何在PostgreSQL中做得最好?

TIA

3 个答案:

答案 0 :(得分:6)

奇怪的是,似乎PostgreSQL仅允许唯一约束中的列,但此处不允许使用表达式
您可以创建唯一的功能索引(作为变通方法),版本9.1支持表达式索引:

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

答案 1 :(得分:2)

如前所述,UNIQUE INDEX效果很好。 对于那些得到“索引表达式中的函数必须标记为IMMUTABLE”的错误,您可以在索引中修复时区:

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

答案 2 :(得分:1)

创建约束时无法转换tservice。

如果约束条件应该作为“日期”类型应用于服务,您也可以将tservice列创建为“date”类型。

您可以像这样更新列的类型:

ALTER TABLE your_table ALTER COLUMN tservice TYPE date;

然后像这样添加约束:

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