Navicat 干货 | 通过检查约束确保 PostgreSQL 的数据完整性

数据完整性对于任何数据库系统来说都是很重要的一方面,它确保存储的数据保持准确、一致且有意义的。在 PostgreSQL 中,维护数据完整性的一个强大工具是使用检查约束。这些约束允许你定义数据必须遵守的规则,以防止无效数据的插入或修改。本文,我们将探讨如何在 PostgreSQL 中使用检查约束去验证数据,并使用免费的 DVD Rental Database 作为演示案例。

了解检查约束

检查约束是限制可以输入到表中的一个列或一组列中的值的规则。这些规则由数据库系统强制执行,防止插入或修改违反指定条件的行。检查约束是使用 CHECK 关键字定义的,后面跟着一个计算结果为布尔值的表达式。

验证租赁期限

假设有一个场景,这个场景使用"dvdrental"数据库中"rental"表的修改版,该表包含一个"rental_duration"列。在 Navicat 表设计器中,这个表的定义可能如下所示:

现在,假设我们希望确保每次租赁的时长始终大于零天。我们可以通过在"rentals_with_rental_period"表中添加检查约束来实现这一目标,具体做法如下:

ALTER TABLE rentals_with_rental_period
ADD CONSTRAINT rental_duration_check
CHECK (rental_duration > 0);

In Navicat we can add a check constraint in the "Checks" tab of the Table Designer. We just need to supply an expression and optional name. Navicat will create a unique name for us if we don't supply one!

在 Navicat 中,我们可以在表设计器的"检查"选项卡中添加检查约束。我们只需要提供一个表达式和可选的名称。如果我们不提供名称,Navicat 会为我们创建一个唯一的名称!

通过执行此约束,任何尝试在"rentals_with_rental_period"表中插入或更新一行,且租赁时长小于或等于零的操作都将导致错误,从而确保只允许有效的租赁时长。

确保有效评级

"dvdrental"数据库中"film"表的另一个例子涉及验证电影评级。假设我们想要将评级限制为某些特定值,如"G"、"PG"、"PG-13"、"R"或"NC-17"。我们可以通过检查约束来实现这一点:

ALTER TABLE film
ADD CONSTRAINT film_rating_check
CHECK (rating IN ('G', 'PG', 'PG-13', 'R', 'NC-17'));

在 Navicat 表设计器中,这是相同的约束:

现在,任何尝试在"film"表中插入或更新评级,但其值不是指定值之一的行的操作都将被拒绝,从而确保只允许有效的评级。

处理空值(NULL)

需要注意的是,除非约束中特别包含检查 NULL 的条件,否则检查约束不会应用于包含 NULL 值的一行或多行。例如,为了强制"film"表中的"rental_rate"列始终大于零且不为 NULL ,我们将使用以下约束:

ALTER TABLE film
ADD CONSTRAINT film_rental_rate_check
CHECK (rental_rate > 0 AND rental_rate IS NOT NULL);

在 Navicat 表设计器中,相同的约束如下:

结语

检查约束是一个确保 PostgreSQL 数据完整性的强大工具。通过定义数据必须遵守的规则,可以防止插入或修改无效数据,从而帮助维护数据库的准确性和一致性。将检查约束纳入数据库设计,可以构建稳定且可靠的数据系统,满足组织的需求。

PostgreSQL 相关技术内容

PostgreSQL 与 Navicat:数据库行业的中坚力量

在 PostgreSQL 中存储三元数据

PostgreSQL 的实体化视图介绍

PostgreSQL 实体化视图的使用

为什么在下一个 IT 项目中选择使用 PostgreSQL

PostgreSQL 中的多版本并发控制

使用 Navicat Monitor 3.0 监控 PostgreSQL

Navicat Monitor 3 中查看 PostgreSQL 实例详细信息

使用 Navicat Monitor 3 跟踪 PostgreSQL 实例查询

在 PostgreSQL 中设置查询超时

更多技术干货,欢迎点击 这里 关注 Navicat 技术智库。

相关推荐
天天要nx18 分钟前
D64【python 接口自动化学习】- python基础之数据库
数据库·python
精进攻城狮@1 小时前
Redis(value的数据类型)
数据库·redis
爪哇学长1 小时前
SQL 注入详解:原理、危害与防范措施
xml·java·数据库·sql·oracle
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ1 小时前
mybatisPlus打印sql配置
数据库·sql
弗拉唐2 小时前
将Excel文件的两个表格经过验证后分别读取到Excel表和数据库
数据库·excel
刘艳兵的学习博客2 小时前
刘艳兵-DBA033-如下那种应用场景符合Oracle ROWID存储规则?
服务器·数据库·oracle·面试·刘艳兵
simpleGq2 小时前
Redis知识点整理 - 脑图
数据库·redis·缓存
NiNg_1_2342 小时前
关系型数据库和非关系型数据库详解
数据库·oracle·nosql
paopaokaka_luck2 小时前
基于Spring Boot+Vue的多媒体素材管理系统的设计与实现
java·数据库·vue.js·spring boot·后端·算法
python资深爱好者2 小时前
NoSQL数据库与关系型数据库的主要区别
数据库·oracle·nosql