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

Ala*_*yne 3 database postgresql

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

  tservice         timestamp without time zone NOT NULL,
  patient_recid    integer NOT NULL
Run Code Online (Sandbox Code Playgroud)

我希望在tservice 的日期创建一个独特的约束,如:

  constraint service_unique UNIQUE (patient_recid, tservice::date)
Run Code Online (Sandbox Code Playgroud)

这会在日期转换时产生语法错误.

如何在PostgreSQL中做得最好?

TIA

kro*_*lko 7

奇怪的是,似乎PostgreSQL只允许唯一约束中的列,但这里不允许使用表达式.

您可以创建唯一的功能索引(作为变通方法),从9.1版支持表达式的索引:

create unique index service_unique 
ON table_name(patient_recid, date_trunc('day',tservice));
Run Code Online (Sandbox Code Playgroud)


小智 7

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

CREATE UNIQUE INDEX service_unique ON table_name(patient_recid, date_trunc('day',tservice AT TIME ZONE 'GMT'));
Run Code Online (Sandbox Code Playgroud)