🚀 优质资源分享 🚀
学习路线指引(点击解锁)知识定位人群定位
进阶级本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
入门级手把手带你打造一个易扩展、更安全、效率更高的量化交易系统
用一句话来总结这种改进就是:
| 1 | 支持唯一性约束和索引将
null值视为相同的值。之前是将
null值索引成不同的值,现在可以通过使用
unique
distinctnulls
not
创建约束,将
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_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
(val1, val2)NULLS
NOT
DISTINCT
);
|
支持的数据的变化
在postgresql 14中或更早的版本,唯一性约束将null与null视为是不相同的。
这与sql标准是相同的,简而言之,null表示unknown。因而,null值也就不违反唯一性约束。
可以通过插入五行相同的记录到表null_old_style
| 1234567891011121314 | INSERT
INTO
null_old_style (val1, val2)
SELECT‘Hello’
,
NULL
FROMgenerate_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
;
id|val1 |val2|SELECT
*
FROM
null_new_style;
--+-----+----+
1|Hello| | |
再想插入一个val1值为’Hello’,val2值为null的记录就会违反唯一性约束:
| 12345 | INSERT
INTO
null_new_style (val1, val2)
SELECT‘Hello’
,
NULL
;
“uq_val1_val2_new”SQL Error [23505]: ERROR: duplicate
key
value violates
unique
constraint
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/
转载文章受原作者版权保护。转载请注明原作者出处!