【PostgreSQL 15】PostgreSQL 15对UNIQUE和NULL的改进
用一句话来总结这种改进就是:
- 支持唯一性约束和索引将null值视为相同的值。之前是将null值索引成不同的值,现在可以通过使用unique nulls not distinct创建约束,将null值视为相同的值。
两种unique风格
创建示例表:
- 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
- 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值。
- INSERT INTO null_new_style (val1, val2)
- SELECT 'Hello', NULL;
- SELECT * FROM null_new_style;
- id|val1 |val2|
- --+-----+----+
- 1|Hello| |
再想插入一个val1值为'Hello',val2值为null的记录就会违反唯一性约束:
- 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就可以插入了:
- INSERT INTO null_new_style (val1, val2)
- SELECT 'World', NULL;
- id|val1 |val2|
- --+-----+----+
- 1|Hello| |
- 3|World| |
【PostgreSQL 15】PostgreSQL 15对UNIQUE和NULL的改进的更多相关文章
- Android BaseAdapter加载多个不同的Item布局时出现UncaughtException in Thread main java.lang.ArrayIndexOutOfBoundsException: length=15; index=15
java.lang.ArrayIndexOutOfBoundsException: length=15; index=15 异常出现的场景:在做聊天界面时,需要插入表情,图片,文字,名片,还有几种较为 ...
- JDK 15 JAVA 15的新特性展望
目录 JEP 371: Hidden Classes JEP 372: 删除 Nashorn JavaScript Engine JEP 377: 新的垃圾回收器ZGC正式上线了 JEP 378: T ...
- 【PostgreSQL 】PostgreSQL 15对distinct的优化
示例表 table t_ex; c1 | c2 ----+---- 2 | B 4 | C 6 | A 2 | C 4 | B 6 | B 2 | A 4 | B 6 | C 2 | C 以下SQL语 ...
- 【PostgreSQL】PostgreSQL 15移除了Stats Collector
试用即将发行的PostgreSQL 15的人会发现少了一个后台进程: postgres 1710 1 0 04:03 ? 00:00:00 /usr/pgsql-15/bin/postmaster ...
- 2017.9.15 postgresql批量插入造成冲突后执行更新
参考来自:https://stackoverflow.com/questions/40647600/postgresql-multi-value-upserts/46233907#46233907 1 ...
- postgresql与Oracle:空字符串与null
空字符串:两个单引号,中间无空格等任何内容 在postgresql中,空字符串与null是不同的:而oracle中,空字符串与null等同.测试如下: postgresql中: postgres=# ...
- .Net程序员学用Oracle系列(15):DUAL、ROWID、NULL
1.DUAL 表 2.ROWID 类型 2.1.利用 ROWID 查询数据 2.2.利用 ROWID 更新数据 3.NULL 值 3.1.NULL 与空字符串 3.2.NULL 与函数 3.3.NUL ...
- Android 线程与消息 机制 15问15答
1.handler,looper,messagequeue三者之间的关系以及各自的角色? 答:MessageQueue就是存储消息的载体,Looper就是无限循环查找这个载体里是否还有消息.Handl ...
- Android 多进程编程 15问15答!
ps:阅读本文 需要对android 多进程编程有一定了解. 1.Android中总共有几种方式进行IPC? 答:一共有两种,一种是binder 还有一种是socket.Binder 大家用的比较多. ...
随机推荐
- 流量录制回放工具jvm-sandbox-repeater入门篇——服务部署
趋于当前技术不断更新.产品功能多元化之下,流量回放的热度也是越来越高. 在前一段时间,测试团队也提到阿里开源的流量回放工具 jvm-sandbox-repeater 我个人就先尝试一下,期间还是遇到一 ...
- 老生常谈系列之Aop--Spring Aop源码解析(一)
老生常谈系列之Aop--Spring Aop源码解析(一) 前言 上一篇文章老生常谈系列之Aop--Spring Aop原理浅析大概阐述了动态代理的相关知识,并且最后的图给了一个Spring Aop实 ...
- PHP_SESSION学习小结
PHP Session PHP session 变量用于存储关于用户会话(session)的信息,或者更改用户会话(session)的设置.Session 变量存储单一用户的信息,并且对于应用程序中的 ...
- 循环中的scanf处理了换行符怎么破
这种情况一般在循环中要求输入一个字符时容易出现问题. 问题在于缓冲区,缓冲区中存留了换行符,所以... 运行下面代码: int main(void){ char a=0; while(1){ scan ...
- 日期和时间API - 读《Java 8实战》
日期与时间 LocalDate 创建一个LocalDate对象并读取其值 // 根据年月日创建日期 LocalDate date1 = LocalDate.of(2014, 3, 18); // 读取 ...
- 05-STL
Day01 笔记 1 STL概论 1.1 STL六大组件 1.1.1 容器.算法.迭代器.仿函数.适配器.空间配置器 1.2 STL优点 1.2.1 内建在C++编译器中,不需要安装额外内容 1.2. ...
- 移动云使用 JuiceFS 支持 Apache HBase 增效降本的探索
作者简介: 陈海峰,移动云数据库 Apache HBase 开发人员,对 Apache HBase.RBF.Apache Spark 有浓厚兴趣. 背景 Apache HBase 是 Apache H ...
- pycharm解释器的配置等
转自:http://www.360doc.com/content/18/0913/14/11881101_786350505.shtml 为什么安装python后,还需要pycharm配置环境 我们实 ...
- kubernetes code-generator使用
目录 Overview Prerequisites CRD code-generator 编写代码模板 code-generator Tag说明 开始填写文件内容 type.go doc.go reg ...
- 『忘了再学』Shell流程控制 — 35、多分支case条件语句
目录 1.case条件语句介绍 2.case语句需要注意的内容 3.练习 示例1 示例2 1.case条件语句介绍 case语句和if-elif-else语句一样都是多分支条件语句,不过和if多分支条 ...