【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 约束。

  • 19
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
PostgreSQL是以加州大学伯克利分校计算机系开发的POSTGRES,现在已经更名为PostgreSQL. PostgreSQL支持大部分SQL标准并且提供了许多其它现代特性:复杂查询、外键、触发器、视图、事务完整性等。 PostgreSQL 是一个免费的对象-关系数据库服务器(数据库管理系统),它在灵活的 BSD-风格许可证下发行。它提供了相对其他开放源代码数据库系统(比如 MySQL 和 Firebird),和专有系统(比如 Oracle、Sybase、IBM 的 DB2 和 Microsoft SQL Server)之外的另一种选择。 事实上, PostgreSQL 的特性覆盖了 SQL-2/SQL-92 和 SQL-3/SQL-99,首先,它包括了可以说是目前世界上最丰富的数据类型的支持,其中有些数据类型可以说连商业数据库都不具备, 比如 IP 类型和几何类型等;其次,PostgreSQL 是全功能的自由软件数据库,很长时间以来,PostgreSQL 是唯一支持事务、子查询、多版本并行控制系统(MVCC)、数据完整性检查等特性的唯一的一种自由软件的数据库管理系统。 Inprise 的 InterBase 以及SAP等厂商将其原先专有软件开放为自由软件之后才打破了这个唯一。最后,PostgreSQL拥有一支非常活跃的开发队伍,而且在许多黑客的努力下,PostgreSQL 的质量日益提高。从技术角度来讲,PostgreSQL 采用的是比较经典的C/S(client/server)结构,也就是一个客户端对应一个服务器端守护进程的模式,这个守护进程分析客户端来的查询请求,生成规划树,进行数据检索并最终把结果格式化输出后返回给客户端。为了便于客户端的程序的编写,由数据库服务器提供了统一的客户端 C 接口。而不同的客户端接口都是源自这个 C 接口,比如ODBC,JDBC,Python,Perl,Tcl,C/C++,ESQL等, 同时也要指出的是,PostgreSQL 对接口的支持也是非常丰富的,几乎支持所有类型的数据库客户端接口。这一点也可以说是 PostgreSQL 一大优点。 本课程作为PostgreSQL数据库管理之三,主要讲解以下内容:1.     PostgreSQL约束讲解和剖析2.     PostgreSQL数据类型3.     PostgreSQL的结构管理4.     PostgreSQL条件达式和操作5.     PostgreSQL使用小技巧

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DBA圈小圈

你的鼓励是我最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值