PostgreSQL 检查约束

在本节中,我们将了解PostgreSQL Check 约束的工作原理,它用于确保列或表的字段中的所有值都满足特定情况。

PostgreSQL 检查约束的示例,如何为新表和现有表创建检查约束。

什么是 PostgreSQL CHECK 约束?

PostgreSQL中, Check 约束可以由单独的名称定义。它用于控制插入的列的值。

它允许我们验证将值存储到记录中的条件。如果该语句为假,则数据会破坏未保存在表中的约束。

换句话说,我们可以说PostgreSQL CHECK 约束用于确保表的列或字段中的所有值都满足某些条件。

例如,检查约束必须匹配布尔表达式才能在将值插入或更新到列之前计算值。

如果值保持检查约束,PostgreSQL 将更新或插入这些值到列。否则,PostgreSQL 将放弃修改并引发违反约束的错误。

使用 create table 语句创建 CHECK 约束的语法

下面的插图用于显示我们如何使用CREATE TABLE命令创建CHECK 约束:

CREATE TABLE table_name(    
col1 datatype,    
col2 datatype,   
CONSTRAINT constraint_name  
CHECK(condition);  
);    

在上面的语法中,我们使用了以下参数,我们在下表中进行了讨论:

参数名称 描述
Table_name 这是我们要创建的表的名称。
column1, column2 这些是我们在表中创建的列。
constraint_name constraint_name 参数用于指定 CHECK 约束的名称。
Column_name(s) 这些列将成为 CHECK 约束。

PostgreSQL CHECK 约束示例

要了解PostgreSQ CHECK 约束的工作原理,我们将看下面的示例。

当我们使用 CREATE TABLE 命令指定表的结构时,我们通常可以使用CHECK 约束。

在下面的示例中,我们创建了一个名为Worker的新表,其中包含多个列,例如Worker_ID、Worker_name、DOB、Joining_date 和 Salary。

但是,在创建Worker表之前,我们将使用DROP TABLE命令检查Jtp数据库中是否已经存在类似的表。

DROP TABLE IF EXISTS Worker;  

执行上述命令后,我们会得到如下窗口信息:Worker表不存在。

现在,我们将使用 CREATE 命令创建Worker表,如以下语句所示:

CREATE TABLE Worker (  
Worker_id SERIAL PRIMARY KEY,  
Worker_name VARCHAR (40),  
DOB DATE CHECK (DOB> '1900-01-01'),  
    Joined_date DATE CHECK (joined_date >DOB),  
    Salary numeric CHECK(salary > 0)  
);  

执行上述命令后,我们会得到如下消息窗口,显示Worker表已成功创建到jtp数据库中。

在上面的Worker表中,我们使用了以下三个 CHECK 约束:

检查约束 描述
First constraint 工人的出生日期 (DOB) 必须大于 01/01/1900。如果我们尝试插入 01/01/1900 之前的出生日期,我们将收到一条错误消息。
Second constraint joined_date 必须大于出生日期 (DOB)。并且此特定检查将防止修改有关其语义含义的错误日期。
Third constraint 工资必须大于零。

成功创建Worker后,我们将在INSERT命令的帮助下向其中输入一些值。 

INSERT INTO Worker (Worker_name, DOB, Joined_date, Salary)  
VALUES ('Mike Ross', '1985-10-01', '2018-11-23', - 300000);  

执行上述命令后,PostgreSQL 发出以下错误,因为我们在Salary列中插入了负薪水值 (-300000)。

错误:关系“worker”的新行违反检​​查约束“worker_salary_check”详细信息:失败行包含(2,Mike Ross,1985-10-01,2018-11-23,-300000)。

由于Salary 列上的CHECK 约束,插入命令失败,该列仅采用正值。

默认情况下,PostgreSQL借助以下模式为CHECK 约束提供名称:

{table}_{column}_check  

让我们看一个示例,其中Salary 列上的约束具有以下约束名称:

Worker_salary_check  

 

热门文章

优秀文章