postgresql - 是否可以在排除约束中使用 IS NOT DISTINCT FROM?

标签 postgresql constraints postgresql-9.5

我有下表:

CREATE TABLE claim (
    claim_number TEXT NOT NULL,
    line_id TEXT,
    process TEXT NOT NULL
);

我想给它添加一个约束,使 claim_number 和 line_id 的组合始终是唯一的。

在大多数情况下,line_id 为空,并且该 claim 编号只有一行。在某些情况下,给定的 claim_number 会有多行,在这些情况下,line_id 将始终包含一个值。这里的目标是能够在 (claim_number, line_id) 组合上有一个强制唯一组合的约束,这样我就可以将它用作 INSERT...ON CONFLICT DO UPDATE 中的冲突目标> 语句,以便可以更新进程列。 UNIQUE 约束不起作用,因为它不计算 NULL = NULL,这有道理,但不是我需要的。

我尝试添加排除约束,例如:

ALTER TABLE claim
ADD EXCLUDE ( claim_number WITH =,
              line_id WITH IS NOT DISTINCT FROM);

但是失败了:

ERROR:  syntax error at or near "IS"

有没有办法在排除约束中使用 IS NOT DISTINCT FROM

最佳答案

在 MSSQL Server 中,这是使用过滤唯一索引完成的,其中过滤谓词是它只索引具有非 NULL 值的行。

我不是 PostgreSQL 专家,但谷歌搜索显示使用“部分索引”是可能的:https://www.postgresql.org/docs/current/static/indexes-partial.html

CREATE UNIQUE INDEX ix_claim_lines ON claim ( claim_number, line_id )
    WHERE line_id IS NOT NULL

关于postgresql - 是否可以在排除约束中使用 IS NOT DISTINCT FROM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45969600/

相关文章:

SQL View 从非规范化表返回过滤后的数据

android - 约束的图形编辑在 Android Studio 2.3.1 中非常慢

sql - PostgreSQL - 为非主键创建一个自增列

sql - 在 postgresql 表中查找最大条目,sql

ruby-on-rails - 连续两行的最大列差

ruby - 创建 : too many command line arguments

SQL/Oracle : Is it possible to have a group function in a check constraint?

sql - 在 Postgresql 中,是否可以在不将约束添加到实体的情况下表达和检查约束?

query-performance - 行级安全性,性能差

sql - 如何获取点击前的点击次数?