微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

postgresql – Postgres唯一约束不强制唯一性

这是我的约束:

CREATE UNIQUE INDEX index_subscriptions_on_user_id_and_class_type_id_and_deleted_at
  ON subscriptions
  USING btree
  (user_id,class_type_id,deleted_at);

查询证明约束实际上不起作用:

SELECT id,user_id,deleted_at
FROM subscriptions;

这是输出

为什么没有强制执行唯一性?

解决方法

Postgres中的唯一索引基于值相等,但NULL永远不会等于任何值,包括其他NULL.因此,任何具有NULL deleted_at值的行都与任何其他可能的行不同 – 因此您可以插入任意数量的行.

解决此问题的一种方法是创建部分索引,对包含和不包含NULL的行应用不同的规则:

CREATE UNIQUE INDEX ... ON subscriptions
 (user_id,class_type_id) WHERE deleted_at IS NULL;

 CREATE UNIQUE INDEX ... ON subscriptions
 (user_id,deleted_at) WHERE deleted_at IS NOT NULL;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐