postgresql - 在postgresql中的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 ::
)
我想以这样的方式对这个表施加uniue约束,即expiry_date和created_at的日期应该是唯一的。问题是 created_at 列是时间戳而不是日期。
那么有没有办法设置唯一约束,使得 expire_date 和 created_at::date 应该是唯一的?
我的尝试是使用
CONSTRAINT user_review_uniq_key UNIQUE (expiry_date, created_at::date)
无效的。
解决方案
如果您的创建日期不需要时区:创建唯一索引如下:
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'));
推荐阅读
- ruby-on-rails - Ruby on Rails 6 AWS Elastic Beanstalk 部署命令 reload_initctl_for_sidekiq 失败
- mysql - 查询优化的 SQL 技巧
- git - 远程:在 github 上拒绝回购的权限
- reactjs - 是的验证问题:具有各自值的字段仍然说字段是必需的
- solr - 如何使用数据类型且不带任何后缀或前缀来决定 solr 中的动态文件
- git - 如何从我的 github 存储库中删除我的电子邮件
- php - 将自定义 HTML 属性添加到 Grav 生成表单的按钮
- embedded - 如何组织 freeRTOS 项目
- javascript - 在反应中使用索引作为键。什么时候有影响,什么时候没有?
- java - Java中有没有办法在一个类中设置变量的值并能够从另一个类中访问