【问题标题】:Postgres unique constraint not enforcing uniquenessPostgres唯一约束不强制唯一性
【发布时间】:2014-06-20 09:09:24
【问题描述】:

这是我的约束:

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, class_type_id,deleted_at
FROM subscriptions;

这是输出:

为什么不强制执行唯一性?

【问题讨论】:

标签: postgresql


【解决方案1】:

Postgres 中的唯一索引基于 equal 的值,但 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, class_type_id, deleted_at) WHERE deleted_at IS NOT NULL;

【讨论】:

    【解决方案2】:

    这是因为created_at 列中的NULL 值。唯一索引(或约束)允许包含 NULL 的多行。

    您可以防止这种情况的唯一方法是将列声明为NOT NULL 以强制为其设置一个值,或者将唯一列减少为(user_id, class_type_id)

    【讨论】:

      猜你喜欢
      • 2015-03-06
      • 1970-01-01
      • 2017-07-07
      • 1970-01-01
      • 1970-01-01
      • 2018-09-11
      • 2014-11-28
      • 2016-09-29
      • 2014-06-25
      相关资源
      最近更新 更多