【PostgreSQL 15】PostgreSQL 15对UNIQUE和NULL的改进
2022-07-21 23:00 abce 阅读(1053) 评论(0) 编辑 收藏 举报用一句话来总结这种改进就是:
1 | 支持唯一性约束和索引将 null 值视为相同的值。之前是将 null 值索引成不同的值,现在可以通过使用 unique nulls not distinct 创建约束,将 null 值视为相同的值。 |
两种unique风格
创建示例表:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | CREATE TABLE null_old_style ( id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY , val1 TEXT NOT NULL , val2 TEXT NULL , CONSTRAINT uq_val1_val2 UNIQUE (val1, val2) ); CREATE TABLE null_new_style ( id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY , val1 TEXT NOT NULL , val2 TEXT NULL , CONSTRAINT uq_val1_val2_new UNIQUE NULLS NOT DISTINCT (val1, val2) ); |
支持的数据的变化
在postgresql 14中或更早的版本,唯一性约束将null与null视为是不相同的。
这与sql标准是相同的,简而言之,null表示unknown。因而,null值也就不违反唯一性约束。
可以通过插入五行相同的记录到表null_old_style
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | INSERT INTO null_old_style (val1, val2) SELECT 'Hello' , NULL FROM generate_series(1, 5) ; SELECT * FROM null_old_style; id|val1 |val2| --+-----+----+ 1|Hello| | 2|Hello| | 3|Hello| | 4|Hello| | 5|Hello| | |
这个行为是有文档可查,符合预期的。
引入了nulls not distinct选项后,唯一性约束更加严格,不再支持多个null值。
1 2 3 4 5 6 7 8 | INSERT INTO null_new_style (val1, val2) SELECT 'Hello' , NULL ; SELECT * FROM null_new_style; id|val1 |val2| --+-----+----+ 1|Hello| | |
再想插入一个val1值为'Hello',val2值为null的记录就会违反唯一性约束:
1 2 3 4 5 | INSERT INTO null_new_style (val1, val2) SELECT 'Hello' , NULL ; SQL Error [23505]: ERROR: duplicate key value violates unique constraint "uq_val1_val2_new" Detail: Key (val1, val2)=(Hello, null ) already exists. |
当然将val1换成'Hello'之外的一个值,val2值为null就可以插入了:
1 2 3 4 5 6 7 | INSERT INTO null_new_style (val1, val2) SELECT 'World' , NULL ; id|val1 |val2| --+-----+----+ 1|Hello| | 3|World| | |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
2016-07-21 MySQL数据复制的校验
2016-07-21 Mysql复制-Slave库设置复制延迟
2016-07-21 MySQL Replication的相关文件
2015-07-21 11G新特性 -- ASM Fast Mirror Resync
2015-07-21 redhat 6.4 安装VirtualBox自动增强功能功:unable to find the sources of your current Linux kernel