【PostgreSQL 15】PostgreSQL 15对UNIQUE和NULL的改进

🚀 优质资源分享 🚀

学习路线指引(点击解锁)知识定位人群定位

进阶级本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。

入门级手把手带你打造一个易扩展、更安全、效率更高的量化交易系统

用一句话来总结这种改进就是:

| 1 | 支持唯一性约束和索引将null值视为相同的值。之前是将null值索引成不同的值,现在可以通过使用uniquenulls notdistinct创建约束,将null值视为相同的值。 |

两种unique风格

创建示例表:

| 1234567891011121314151617 | CREATE TABLE null_old_style(id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,val1 TEXT NOT NULL,val2 TEXT NULL,CONSTRAINT uq_val1_val2UNIQUE(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_newUNIQUENULLS NOT DISTINCT(val1, val2)); |

支持的数据的变化

在postgresql 14中或更早的版本,唯一性约束将null与null视为是不相同的。

这与sql标准是相同的,简而言之,null表示unknown。因而,null值也就不违反唯一性约束。

可以通过插入五行相同的记录到表null_old_style

| 1234567891011121314 | INSERT INTO null_old_style (val1, val2)SELECT‘Hello’, NULLFROMgenerate_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值。

| 12345678 | INSERT INTO null_new_style (val1, val2)SELECT‘Hello’, NULL;SELECT * FROM null_new_style;id|val1 |val2|--+-----+----+1|Hello|    | |

再想插入一个val1值为’Hello’,val2值为null的记录就会违反唯一性约束:

| 12345 | 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就可以插入了:

| 1234567 | INSERT INTO null_new_style (val1, val2)SELECT‘World’, NULL;id|val1 |val2|--+-----+----+1|Hello|    |3|World|    | |

Original: https://blog.csdn.net/u013190417/article/details/125924066
Author: 虚幻私塾
Title: 【PostgreSQL 15】PostgreSQL 15对UNIQUE和NULL的改进

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/750293/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球