两个令人兴奋的 PostgreSQL 特性可改善 NULL 处理#PG认证

news2024/10/5 22:38:34

唯一列中的 NULL 值永久链接

一个众所周知但令人讨厌的怪异值NULL是NULL != NULL,因此一UNIQUE列仍然可以有多个NULL值。
#PG培训#PG考试#postgresql培训#postgresql考试#postgresql认证
在这里插入图片描述

(为了简单起见,示例使用数字 id 列,但我通常更喜欢更复杂的 id,例如ULID。)

CREATE TABLE test (
    id serial PRIMARY KEY,
    value TEXT UNIQUE
);

INSERT INTO test (value) VALUES ('a');

-- This fails on the duplicate:
--   ERROR:  duplicate key value violates unique constraint "test_value_key"
--   DETAIL:  Key (value)=(a) already exists.
INSERT INTO test (value) VALUES ('a');

-- But this does not:
INSERT INTO test (value) VALUES (null);
INSERT INTO test (value) VALUES (null);

SELECT * from test;
 id | value
----+-------
  1 | a
  3 |
  4 |
(3 rows)

然而,PostgreSQL 15 发布了一项新功能,可以改变这种行为UNIQUE NULLS NOT DISTINCT::

CREATE TABLE test (
    id serial PRIMARY KEY,
    value TEXT UNIQUE NULLS NOT DISTINCT
);

-- Now this fails on the second insert:
--   ERROR:  duplicate key value violates unique constraint "test_value_key"
--   DETAIL:  Key (value)=(null) already exists.
INSERT INTO test (value) VALUES (null);
INSERT INTO test (value) VALUES (null);

确保单个列有值永久链接

我遇到的一个常见用例是,一个表有多个外键,但只需要填充一个。例如,假设我们有一个notifications表来表示我们发出的通知(例如电子邮件、短信等)。这些通知可能会被触发并与我们系统中的特定实体相关,例如订单、用户、公司等。我们想添加外键来表示此通知的用途,但我们只想填充其中一个。

例如:

CREATE TABLE notifications (
    id serial,
    company_id INT REFERENCES companies (id),
    order_id INT REFERENCES orders (id),
    user_id INT REFERENCES users (id)
);

INSERT INTO notifications (company_id) VALUES (100);
INSERT INTO notifications (order_id) VALUES (200);

SELECT * from notifications;

 id | company_id | order_id | user_id
----+------------+----------+---------
  1 |        100 |          |
  2 |            |      200 |
(2 rows)

通常,我会看到像这样的表添加约束以确保至少有一列被填充:

ALTER TABLE notifications
ADD CONSTRAINT notifications_reference
CHECK (company_id IS NOT NULL OR order_id IS NOT NULL OR user_id IS NOT NULL);

但是,这并不能阻止您意外填充多个列。如果您使用为您生成 SQL 的对象关系映射器 (ORM),并且您意外设置了对象的多个属性,则很容易发生这种情况:

INSERT INTO notifications (company_id, order_id, user_id)
VALUES (NULL, 300, 400);

SELECT * from notifications;

 id | company_id | order_id | user_id
----+------------+----------+---------
  1 |        100 |          |
  2 |            |      200 |
  3 |            |      300 |     400
(3 rows)

不过,有一对 PostgreSQL 函数可以让我们编写更好的约束检查,称为num_nulls/num_nonnulls。这让我们可以检查一组列中是否只有一个非 NULL 值。例如:

ALTER TABLE notifications
ADD CONSTRAINT notifications_reference
CHECK (num_nonnulls(company_id, order_id, user_id) = 1);

-- Now we get an error on insert if there is more than one value:
--   ERROR:  new row for relation "notifications" violates check constraint "notifications_reference"
--   DETAIL:  Failing row contains (3, null, 300, 400).
INSERT INTO notifications (company_id, order_id, user_id)
VALUES (NULL, 300, 400);

-- Or if there are no values:
--   ERROR:  new row for relation "notifications" violates check constraint "notifications_reference"
--   DETAIL:  Failing row contains (4, null, null, null).
INSERT INTO notifications (company_id, order_id, user_id)
VALUES (NULL, NULL, NULL);

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1892331.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DevExpress WPF中文教程:Grid - 如何显示摘要(设计时)?

DevExpress WPF拥有120个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

chrome 谷歌浏览器插件打包

1、找到id对应的字符串去搜索 C:\Users\<你的用户名>\AppData\Local\Google\Chrome\User Data\Default\Extensions2、选择根目录 直接加载下面的路径扩展可用&#xff1a;

liteide教程-运行平台和3264位

【1】编译后的运行平台选择&#xff08;linux/windows&#xff09; 1&#xff09;点击"查看"&#xff0c;选择"编辑当前环境" 2)GOOS参数修改 GOOSlinux //表示linux系统 GOOSwindows //表示Windows系统 【2】编译后的是32位还是64位程序 1&#x…

Word文档中公式的常用操作

一、参考资料 二、常用操作 插入公式 Alt 多行公式 Shift Enter 多行公式对齐 WORD Tips: 多行公式编辑及对齐 word自带公式等号对齐&#xff08;可任意符号处对齐&#xff09; 多行公式按照 为基准对齐。 拖动鼠标选中整个公式点击右键&#xff0c;选择【对齐点(…

使用表单系统快速搭建邀请和签到系统

在组织活动时&#xff0c;邀请和签到环节往往是活动成败的关键之一。传统的纸质邀请和签到方式不仅费时费力&#xff0c;还容易出现各种问题&#xff0c;例如名单遗漏、签到混乱等。而使用TDuckX“搭建邀请和签到系统”将彻底改变这一现状&#xff0c;为活动组织者提供了一种高…

半实物仿真测试系统

设备组成 test系统主要由硬件部分与软件部分组成。硬件部分由PCI机箱、PCI控制器以及各种PCI接口板卡组成。软件部分由测试设计软件模块、测试执行服务软件模块、测试执行客户端软件模块、设备资源管理软件模块等主要软件模块以及曲线数据生成、CRC插件生成与诊断、测试数据记录…

模块一SpringBoot(一)

maven记得配置本地路径和镜像 IJ搭建 SpringIntiallizer--》将https://start.spring.io改成https://start.aliyun.com/ 项目结构 Spring有默认配置&#xff0c; application.properties会覆盖默认信息&#xff1a; 如覆盖端口号server.port8888

项目管理:项目进度延迟怎么办?做好这三点就够了

项目管理中&#xff0c;项目进度延迟是项目经理常常面临的挑战之一。它不仅影响项目的按时完成&#xff0c;还可能对项目的整体质量、成本控制及客户满意度产生负面影响。 更为严重的是&#xff0c;当管理者对项目进度的实际情况一无所知&#xff0c;即出现“无法掌控”的局面…

翔云发票查验接口状态码说明,哪种情况扣次数那种情况不扣次数呢

翔云发票查验API&#xff0c;实时联网&#xff0c;可以实现发票信息真伪的快速核验&#xff0c;帮助企业财务摆脱繁琐的发票真伪查验工作。那么知道了发票查验接口的作用&#xff0c;对于开发者而言&#xff0c;接口返回的状态码又分别代表什么含义呢&#xff1f;下面就翔云发票…

【LeetCode:841. 钥匙和房间 + DFS】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

台灯学生用哪个牌子最好?学生用台灯品牌排行榜分析

台灯学生用哪个牌子最好&#xff1f;护眼台灯在近年来成为家长和长时间使用电子设备人群关注的家电/学生产品。对于家中有孩子或经常面对电子屏幕的人士来说&#xff0c;很多人可能已经对这类产品有所了解并进行了购买。然而&#xff0c;部分家长对护眼台灯的认识还不够深入&am…

国产强大免费WAF, 社区版雷池动态防护介绍

雷池WAF&#xff0c;基于智能语义分析的下一代 Web 应用防火墙 使用情况 我司于2023年4月23日对雷池进行测试&#xff0c;测试一个月后&#xff0c;于2023年5月24日对雷池进行正式切换&#xff0c;此时版本为1.5.1。 里程碑纪念 后续一直跟随雷池进行版本升级&#xff0c;当前…

聚四氟乙烯消解管/PTFE四氟消化管/配套各厂家石墨消解仪

四氟消解瓶&#xff0c;通常指的是采用聚四氟乙烯&#xff08;PTFE&#xff0c;也称为特氟龙或铁氟龙&#xff09;材料制成的实验室消解容器。 以下是关于四氟消解瓶的一些基本信息&#xff1a; 材质特性&#xff1a; 四氟消解瓶由PTFE材料制成&#xff0c;具有极佳的耐腐蚀…

Beyond Compare 解锁版下载及安装教程 (文件和文件夹比较工具)

前言 Beyond Compare 是一款功能强大的文件和文件夹比较工具。它支持文件夹比较、文件夹合并与同步、文本比较、表格比较、图片比较、16进制比较、注册表比较、版本比较等多种功能。通过 Beyond Compare&#xff0c;您可以轻松调查文件和文件夹之间的不同之处&#xff0c;并使…

System: Active job threshold reached. Retrying in 60 seconds

LSF提交作业提示&#xff1a;System: Active job threshold reached. Retrying in 60 seconds [lsfadminmaster ~]$ bsub -n 6 -R "rusage[mem2000]" sleep 100 System: Active job threshold reached. Retrying in 60 seconds...原因是LSF社区版对active作业有限制…

蓝牙资讯|苹果Apple Pencil新专利:用笔套扩展传感器 / 续航等模块化方案

根据美国商标和专利局最新公示的清单&#xff0c;苹果公司获得了一项 Apple Pencil 的专利&#xff0c;探索了模块化设计方案&#xff0c;用户未来可以根据自身需求或者使用场景&#xff0c;随心更换 Pencil 的模块&#xff0c;达到不同的效果。 苹果在专利中表示笔套内置传感器…

APP INVENTOR硬件交互学习教程05——自动连接蓝牙实现

每次打开手机APP&#xff0c;需要选择蓝牙&#xff0c;用起来很麻烦。有没有方法实现自动连接上次的地址呢&#xff0c;接下来请看吧&#xff01;1.界面设计增加了一个微数据库组件&#xff0c;借助它用来存储硬件地址 2.程序设计这里主要用两个方法&#xff0c;存储地址方法…

护眼贴士之学生护眼台灯哪个品牌好?来看看适合学生写作业的台灯

中国当前正深陷于严峻的近视危机之中&#xff0c;各教育阶段学生的近视率居高不下&#xff0c;尤为令人担忧的是&#xff0c;高度近视的比例亦呈显著上升趋势。为了让孩子在学习的过程中拥有更好的视力保护&#xff0c;不少家长会选择购买性价比高、健康护眼的台灯。专业的护眼…

大语言模型测评工具-ChatHub和ChatAll

背景 现在国内外拥有上百个大语言模型&#xff0c;在AI业务中&#xff0c;我们需要在其中选择一个合适业务模型&#xff0c;就需要对这些模型进行测试。手工去测试这么多模型效率一定不高&#xff0c;今天就介绍两个提高测评模型效率的工具 ChatHub和ChatAll。 介绍 ChatHub…

k8s上部署单节点apache-lotdb

一、yaml文件 使用的nfs的动态存储类&#xff0c;需要提前搭建。 # cat iotdb_deployment.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata:name: logsnamespace: lotdb spec:storageClassName: "nfs-client"accessModes:- ReadWriteManyresources:req…