PostgreSQL组合唯一约束空值问题

本文探讨PostgreSQL中组合唯一键遇到的空值问题,如何通过创建唯一索引来确保唯一性,并提供了实际案例和解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为 PostgreSQL唯一约束并考虑空值的唯一性,我们虽然在列上定义了唯一约束,但仍然会存在重复数据。PostgreSQL唯一约束的规则是,唯一键的列值可以为NULL。

问题描述

在多个列上定义组合唯一键,那么当其中一个值为空而其他值不为空时约束不起作用,下面看详细过程。

  • 创建表
CREATE TABLE TestUniqueNull
(
    ID INTEGER 
    ,NoA INTEGER 
    ,NoB INTEGER 
    ,NoC INTEGER 
    ,CONSTRAINT pk_tbl_TestUniqueNull_ID PRIMARY KEY(ID)
    ,CONSTRAINT uk_tbl_TestUniqueNull_NoA_NoB_NoC unique (NoA,NoB,NoC)
);
  • 插入示例数据
INSERT INTO TestUniqueNull VALUES (1,1,2,NULL);
INSERT INTO TestUniqueNull VALUES (2,1,2,NULL);
INSERT INTO TestUniqueNull VALUES (3,1,5,NULL);
INSERT INTO TestUniqueNull VALUES (4,3,NULL,1);
INSERT INTO TestUniqueNull VALUES (5,3,NULL,1);
  • 查看数据
idnoanobnoc
112
212
315
431
531

我们看到当列值为空时,存在重复记录,违背了定义唯一约束的需求。

使用唯一索引

针对上面的问题,我们使用唯一索引代替组合唯一约束:

CREATE TABLE TestUniqueNull
(
    ID INTEGER 
    ,NoA INTEGER 
    ,NoB INTEGER 
    ,NoC INTEGER 
    ,CONSTRAINT pk_tbl_TestUniqueNull_ID PRIMARY KEY(ID)
);

CREATE UNIQUE INDEX UIdx_NoA_NoB_NoC 
                    ON TestUniqueNull(coalesce(NoA,-1),coalesce(NoB,-1),coalesce(NoC,-1));

再次插入示例会报错:

SQL 错误 [23505]: 错误: 重复键违反唯一约束 “uidx_noa_nob_noc”
Detail: 键值"(COALESCE(noa, ‘-1’::integer), COALESCE(nob, ‘-1’::integer), COALESCE(noc, ‘-1’::integer))=(1, 2, -1)" 已经存在

总结

本文描述PostgreSQL 组合唯一约束空值问题,并给出使用唯一索引代替约束的解决方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值