【PostgreSQL】约束-检查约束

news/2024/7/9 21:10:00 标签: postgresql, 数据库

【PostgreSQL】约束链接

检查
唯一
主键
外键
排他

检查约束

在计算机科学和软件工程中,约束检查是指在程序运行时对变量或数据进行检查,确保其满足一定的规则或条件。这些规则或条件可以是预定义的,也可以是通过编程语言的约束机制定义的。

约束检查可以用于检查以下方面:

  • 数据类型约束:确保变量的数据类型符合预期,例如一个变量应该是整数类型。
  • 范围约束:确保变量的值在一定范围内,例如一个年龄变量应该在0到100之间。
  • 唯一性约束:确保数据的唯一性,例如一个用户名应该是唯一的。
  • 关联约束:确保不同数据之间的关系和一致性,例如一个学生的年级应该与其所在班级相对应。
  • 条件约束:根据特定条件对变量或数据进行限制,例如只有在指定条件满足时,才能执行某个操作。
    约束检查通常在程序的运行时进行,可以通过条件语句、异常处理等方式实现。如果变量或数据不满足约束条件,程序可以采取相应的处理措施,例如抛出异常、终止程序或给出警告信息。

约束检查对于保证程序的正确性和可靠性至关重要,可以避免一些潜在的错误和异常情况的发生,提高程序的质量和性能。

PostgreSQL 检查约束

检查约束是最通用的约束类型。它允许您指定特定列中的值必须满足布尔值(真值)表达式。例如,要要求产品价格为正,您可以使用:

CREATE TABLE products (
    product_no integer,
    name text,
    price numeric CHECK (price > 0)
);

如您所见,约束定义位于数据类型之后,就像默认值定义一样。默认值和约束可以按任意顺序列出。检查约束由关键字和括号中的表达式组成。检查约束表达式应涉及受此约束的列,否则约束将没有太大意义。

还可以为约束指定一个单独的名称。这阐明了错误消息,并允许您在需要更改约束时引用约束。语法为:

CREATE TABLE products (
    product_no integer,
    name text,
    price numeric CONSTRAINT positive_price CHECK (price > 0)
);

因此,若要指定命名约束,请使用关键字CONSTRAINT后跟标识符,后跟约束定义。(如果不以这种方式指定约束名称,系统将为您选择一个名称。

CHECK 约束还可以引用多个列。假设您存储了正常价格和折扣价格,并且您希望确保折扣价格低于正常价格:

CREATE TABLE products (
    product_no integer,
    name text,
    price numeric CHECK (price > 0),
    discounted_price numeric CHECK (discounted_price > 0),
    CHECK (price > discounted_price)
);

前两个约束应该看起来很熟悉。第三个使用新语法。它不附加到特定列,而是在逗号分隔的列列表中显示为单独的项目。列定义和这些约束定义可以按混合顺序列出。

我们说前两个约束是列约束,而第三个约束是表约束,因为它是与任何一个列定义分开编写的。列约束也可以写成表约束,而反之则不一定可行,因为列约束应该只引用它所附加到的列。(PostgreSQL 不强制执行该规则,但如果您希望表定义与其他数据库系统一起使用,则应遵循该规则。上面的例子也可以写成:

CREATE TABLE products (
    product_no integer,
    name text,
    price numeric,
    CHECK (price > 0),
    discounted_price numeric,
    CHECK (discounted_price > 0),
    CHECK (price > discounted_price)
);

甚至:

CREATE TABLE products (
    product_no integer,
    name text,
    price numeric CHECK (price > 0),
    discounted_price numeric,
    CHECK (discounted_price > 0 AND price > discounted_price)
);

可以采用与列约束相同的方式将名称分配给表约束:

CREATE TABLE products (
    product_no integer,
    name text,
    price numeric,
    CHECK (price > 0),
    discounted_price numeric,
    CHECK (discounted_price > 0),
    CONSTRAINT valid_discount CHECK (price > discounted_price)
);

应该注意的是,如果 check 表达式的计算结果为 true 或 null 值,则满足 CHECK 约束。由于如果任何操作数为 null,大多数表达式的计算结果为 null 值,因此它们不会阻止约束列中的 null 值。若要确保列不包含 null 值,可以使用下一节中描述的 not-null 约束。


http://www.niftyadmin.cn/n/5301389.html

相关文章

MySQL运维实战(2.2)忘记密码如何处理

作者:俊达 引言 当你突然忘记了一个普通用户的密码,而又想着通过管理员账号去改密码时,却猛的发现所有管理员账号的密码都离谱地被你忘了。嗨呀,这可真是个尴尬的大麻烦!root账户通常是MySQL中的大boss,你…

职场闲唠-国家传授的经验

文章目录 1 职场转型职场菜鸟如何“过五关获六智”职场的酸甜苦辣职业规划难以制定成功的12种心态出色的学习能力 才是你唯一可持续的竞争优势给职场新手的五点建议要做好一个事情,干好一份工作,不但要知其然,还要知其所以然。戒掉情绪&#…

软件测试之测试用例和缺陷报告模板分享

对于测试工程师,必备技能之一便是测试用例的编写和软件缺陷报告的编写啦~下面提供一些模板还有项目实战样例供大家参考参考, 1.通过Excel表格编写测试用例 2. 缺陷报告模板 下面来个实战案例 3.在线课程作业管理系统项目测试用例(部分&…

六、Redis 分布式系统 —— 超详细操作演示!

六、Redis 分布式系统 —— 超详细操作演示! 六、Redis 分布式系统6.1 数据分区算法6.1.1 顺序分区6.1.2 哈希分区 6.2 系统搭建与运行6.2.1 系统搭建6.2.2 系统启动与关闭 6.3 集群操作6.3.1 连接集群6.3.2 写入数据6.3.3 集群查询6.3.4 故障转移6.3.5 集群扩容6.3…

熔断、隔离、重试、降级、超时、限流,高可用架构流量治理核心策略全掌握

可用性的定义 在探讨高可用架构之前,让我们以 O2 系统为例,解释一下何谓可用性。O2 是腾讯内部的一个广告投放系统,专注于提升投放效率、分析广告效果,拥有自动化广告投放、AIGC 自动化素材生产等多种功能。 其整体架构概览如下&…

[Vulnhub靶机] DriftingBlues: 2

[Vulnhub靶机] DriftingBlues: 2靶机渗透思路及方法(个人分享) 靶机下载地址: https://download.vulnhub.com/driftingblues/driftingblues2.ova 靶机地址:192.168.67.21 攻击机地址:192.168.67.3 一、信息收集 1.…

Python 自学(二) 之流程控制语句

目录 1. if ... elif ... else 语句 P62 2. True False 3. for 数值循环 in range() P69 4. for 遍历字符串,列表,元组,集合和字典 in obj P70 5. pass 空语句 1. if ... elif ... else 语句 P62 每个判断语句后面要加 :elif …

Cesium特效-2023年汇总

1-3dTiles建筑实现随机贴图 使用3dTiles的customShader接口,在前端实现不同白模建筑贴不同的图片 2-淡入淡出的扩散雷达效果 在扩散雷的基础上,实现渐隐渐现的效果 3-不规则多边形的扩散效果 指定一个中心点,改变每个多边形的顶点位置来实现动…