加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-13 16:07:05 所属栏目:百科 来源:网络整理
导读:这是我的约束: 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_atFROM subscriptio
这是我的约束:

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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读