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

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

两种unique风格

创建示例表:

  1. CREATE TABLE null_old_style
  2. (
  3. id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
  4. val1 TEXT NOT NULL,
  5. val2 TEXT NULL,
  6. CONSTRAINT uq_val1_val2
  7. UNIQUE (val1, val2)
  8. );
  9.  
  10. CREATE TABLE null_new_style
  11. (
  12. id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
  13. val1 TEXT NOT NULL,
  14. val2 TEXT NULL,
  15. CONSTRAINT uq_val1_val2_new
  16. UNIQUE NULLS NOT DISTINCT (val1, val2)
  17. );

支持的数据的变化

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

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

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

  1. INSERT INTO null_old_style (val1, val2)
  2. SELECT 'Hello', NULL
  3. FROM generate_series(1, 5)
  4. ;
  5.  
  6. SELECT * FROM null_old_style;
  7.  
  8. id|val1 |val2|
  9. --+-----+----+
  10. 1|Hello| |
  11. 2|Hello| |
  12. 3|Hello| |
  13. 4|Hello| |
  14. 5|Hello| |

这个行为是有文档可查,符合预期的。

引入了nulls not distinct选项后,唯一性约束更加严格,不再支持多个null值。

  1. INSERT INTO null_new_style (val1, val2)
  2. SELECT 'Hello', NULL;
  3.  
  4. SELECT * FROM null_new_style;
  5.  
  6. id|val1 |val2|
  7. --+-----+----+
  8. 1|Hello| |

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

  1. INSERT INTO null_new_style (val1, val2)
  2. SELECT 'Hello', NULL;
  3.  
  4. SQL Error [23505]: ERROR: duplicate key value violates unique constraint "uq_val1_val2_new"
  5. Detail: Key (val1, val2)=(Hello, null) already exists.

当然将val1换成'Hello'之外的一个值,val2值为null就可以插入了:

  1. INSERT INTO null_new_style (val1, val2)
  2. SELECT 'World', NULL;
  3.  
  4. id|val1 |val2|
  5. --+-----+----+
  6. 1|Hello| |
  7. 3|World| |

【PostgreSQL 15】PostgreSQL 15对UNIQUE和NULL的改进的更多相关文章

  1. Android BaseAdapter加载多个不同的Item布局时出现UncaughtException in Thread main java.lang.ArrayIndexOutOfBoundsException: length=15; index=15

    java.lang.ArrayIndexOutOfBoundsException: length=15; index=15 异常出现的场景:在做聊天界面时,需要插入表情,图片,文字,名片,还有几种较为 ...

  2. JDK 15 JAVA 15的新特性展望

    目录 JEP 371: Hidden Classes JEP 372: 删除 Nashorn JavaScript Engine JEP 377: 新的垃圾回收器ZGC正式上线了 JEP 378: T ...

  3. 【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语 ...

  4. 【PostgreSQL】PostgreSQL 15移除了Stats Collector

    试用即将发行的PostgreSQL 15的人会发现少了一个后台进程:​ postgres 1710 1 0 04:03 ? 00:00:00 /usr/pgsql-15/bin/postmaster ...

  5. 2017.9.15 postgresql批量插入造成冲突后执行更新

    参考来自:https://stackoverflow.com/questions/40647600/postgresql-multi-value-upserts/46233907#46233907 1 ...

  6. postgresql与Oracle:空字符串与null

    空字符串:两个单引号,中间无空格等任何内容 在postgresql中,空字符串与null是不同的:而oracle中,空字符串与null等同.测试如下: postgresql中: postgres=# ...

  7. .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 ...

  8. Android 线程与消息 机制 15问15答

    1.handler,looper,messagequeue三者之间的关系以及各自的角色? 答:MessageQueue就是存储消息的载体,Looper就是无限循环查找这个载体里是否还有消息.Handl ...

  9. Android 多进程编程 15问15答!

    ps:阅读本文 需要对android 多进程编程有一定了解. 1.Android中总共有几种方式进行IPC? 答:一共有两种,一种是binder 还有一种是socket.Binder 大家用的比较多. ...

随机推荐

  1. 流量录制回放工具jvm-sandbox-repeater入门篇——服务部署

    趋于当前技术不断更新.产品功能多元化之下,流量回放的热度也是越来越高. 在前一段时间,测试团队也提到阿里开源的流量回放工具 jvm-sandbox-repeater 我个人就先尝试一下,期间还是遇到一 ...

  2. 老生常谈系列之Aop--Spring Aop源码解析(一)

    老生常谈系列之Aop--Spring Aop源码解析(一) 前言 上一篇文章老生常谈系列之Aop--Spring Aop原理浅析大概阐述了动态代理的相关知识,并且最后的图给了一个Spring Aop实 ...

  3. PHP_SESSION学习小结

    PHP Session PHP session 变量用于存储关于用户会话(session)的信息,或者更改用户会话(session)的设置.Session 变量存储单一用户的信息,并且对于应用程序中的 ...

  4. 循环中的scanf处理了换行符怎么破

    这种情况一般在循环中要求输入一个字符时容易出现问题. 问题在于缓冲区,缓冲区中存留了换行符,所以... 运行下面代码: int main(void){ char a=0; while(1){ scan ...

  5. 日期和时间API - 读《Java 8实战》

    日期与时间 LocalDate 创建一个LocalDate对象并读取其值 // 根据年月日创建日期 LocalDate date1 = LocalDate.of(2014, 3, 18); // 读取 ...

  6. 05-STL

    Day01 笔记 1 STL概论 1.1 STL六大组件 1.1.1 容器.算法.迭代器.仿函数.适配器.空间配置器 1.2 STL优点 1.2.1 内建在C++编译器中,不需要安装额外内容 1.2. ...

  7. 移动云使用 JuiceFS 支持 Apache HBase 增效降本的探索

    作者简介: 陈海峰,移动云数据库 Apache HBase 开发人员,对 Apache HBase.RBF.Apache Spark 有浓厚兴趣. 背景 Apache HBase 是 Apache H ...

  8. pycharm解释器的配置等

    转自:http://www.360doc.com/content/18/0913/14/11881101_786350505.shtml 为什么安装python后,还需要pycharm配置环境 我们实 ...

  9. kubernetes code-generator使用

    目录 Overview Prerequisites CRD code-generator 编写代码模板 code-generator Tag说明 开始填写文件内容 type.go doc.go reg ...

  10. 『忘了再学』Shell流程控制 — 35、多分支case条件语句

    目录 1.case条件语句介绍 2.case语句需要注意的内容 3.练习 示例1 示例2 1.case条件语句介绍 case语句和if-elif-else语句一样都是多分支条件语句,不过和if多分支条 ...