gpt4 book ai didi

postgresql - PostgreSQL 完整性检查中的多个唯一部分索引

转载 作者:行者123 更新时间:2023-11-29 13:34:15 26 4
gpt4 key购买 nike

我正在尝试找出在 PostgreSQL 中跨多个可为 null 的列强制执行唯一约束的最佳方法。

考虑下表:

CREATE TABLE test_table
(
id serial NOT NULL,
col_a character varying(255),
col_b character varying(255),
col_c date,
col_d integer,
CONSTRAINT test_table_pkey PRIMARY KEY (id ),
CONSTRAINT test_table_col_a_col_b_col_c_key UNIQUE (col_a , col_b , col_c )
);

col_acol_bcol_c 的组合必须是唯一的,但它们也都可以为空。

我目前实现唯一约束的解决方案是创建 6 个部分索引(下面的伪代码):

unique(col_a, col_b) where col_c is null
unique(col_a, col_c) where col_b is null
unique(col_b, col_c) where col_a is null
unique(col_a) where col_b is null and col_c is null
unique(col_b) where col_a is null and col_c is null
unique(col_c) where col_a is null and col_b is null

这是一件“理智”的事情吗?是否有任何我应该注意的重大性能问题?

最佳答案

据我所知,这是通过声明(使用create tablecreate unique index 等)来实现的唯一方法。当然,每个索引都必须更新。如果您的表增长超过一定限度,这可能是个问题。

这可能并不适用于所有情况,但为了避免需要这么多索引,我将列声明为非空,并放置一个逻辑空值 在其中(例如:“Empty”、“None”或“1900-01-01”)。当然,稍后,无论是在临时查询中还是在应用程序中,您可能都必须将其解码回真正的 null

关于postgresql - PostgreSQL 完整性检查中的多个唯一部分索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16934668/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com