在postgresql中的TIMESTAMP列上应用日期的唯一约束

时间:2019-04-25 10:19:01

标签: postgresql unique-constraint sql-timestamp

我有一个PostgreSQL表

CREATE TABLE IF NOT EXISTS table_name
(
    expiry_date DATE NOT NULL,
    created_at TIMESTAMP with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP(0),
    CONSTRAINT user_review_uniq_key UNIQUE (expiry_date, created_at::date) -- my wrong attempt of using ::
)

我要对此表施加唯一约束,以使expiry_date和created_at的日期应该唯一。问题所在created_at列不是时间戳,不是日期。

那么有什么方法可以放置唯一性约束,以便expire_date和created_at :: date应该是唯一的?

我的尝试是使用
CONSTRAINT user_review_uniq_key UNIQUE (expiry_date, created_at::date)无效。

1 个答案:

答案 0 :(得分:2)

如果创建日期不需要时区:创建唯一索引如下:

create unique index idx_user_review_uniq_key on  table_name (expiry_date, cast(created_at as date));

如果您非常需要一个时区,那么您需要使用一些技巧(https://gist.github.com/cobusc/5875282):

create unique index idx_user_review_uniq_key on  table_name (expiry_date, date(created_at at TIME zone 'UTC'));

希望这会有所帮助;)