数据完整性对于任何数据库系统来说都是很重要的一方面,它确保存储的数据保持准确、一致且有意义的。在 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 数据完整性的强大工具。通过定义数据必须遵守的规则,可以防止插入或修改无效数据,从而帮助维护数据库的准确性和一致性。将检查约束纳入数据库设计,可以构建稳定且可靠的数据系统,满足组织的需求。