PostgreSQL CHECK Constraint


PostgreSQL CHECK Constraint

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

例子中的PostgreSQL的CHECK Constraint,如何创建新表和现有表CHECK Constraint。

什么是 PostgreSQL CHECK Constraint?

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

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

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

例如,CHECK Constraint必须与布尔表达式匹配才能在将值插入或更新到列之前计算这些值。

如果值保持CHECK Constraint,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;

输出

执行上述命令后,我们会得到如下窗口信息:The Worker\ table does not exist。

CHECK Constraint

现在,我们将使用 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数据库中。

CHECK Constraint

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

CHECK Constraint 描述
First constraint 工人的出生日期 (DOB) 必须大于 01/01/1900。如果我们尝试在 01/01/1900 之前插入出生日期,我们将收到一条错误消息。
Second constraint join_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”的新行违反CHECK Constraint“worker_salary_check”详细信息:失败的行包含(2,Mike Ross,1985-10-01,2018-11-23,-300000)。

CHECK Constraint

INSERT命令是由于失败的CHECK约束Salary列,这只需正值

默认情况下,PostgreSQL在以下模式的帮助下为CHECK 约束提供一个名称:

{table}_{column}_check

让我们来看看其中的一个例子约束Salary列有如下约束名称:

Worker_salary_check

PostgreSQL CHECK 约束在一个单独的名称

如果我们想为 CHECK 约束分配一个单独的名称,我们可以在CONSTRAINT 表达式之后定义它,如下图所示:

column_name data_type CONSTRAINT constraint_name CHECK(...)

让我们看一个示例以了解如何在 PostgreSQL CHECK Constraint中使用单独的名称

为此,我们将使用 CREATE 命令创建一个新表作为Orders\,如下所示:

CREATE TABLE Orders(  
Order_no INTEGER,  
Article_name VARCHAR(45),  
Order_date DATE,  
Order_quantity NUMERIC,  
Article_Price NUMERIC CONSTRAINT positive_Article_price CHECK (Article_Price>0)  
);

输出

在执行上述命令时,我们将收到以下窗口消息,显示订单\表已成功创建。

CHECK Constraint

如果我们想查看约束数据字典,我们可以按照以下步骤操作:

步骤1

打开SQL shell (psql),其中显示了必要的详细信息。之后,我们将使用我们在 PostgreSQL 安装过程中创建的密码**登录**到 Postgres 数据库服务器。

提供密码后,我们连接到Postgres 服务器,如下面的屏幕截图所示:

CHECK Constraint

第2步

现在,我们将连接到我们之前在以下命令的帮助下创建的特定数据库服务器jtp

\c jtp

CHECK Constraint

第 3 步

之后,我们将执行以下语法来列出特定表的所有约束(主键、检查、唯一)

\d+ tablename

最后,我们使用上面的命令来查看用于Orders\表的约束:

\d+ Orders

输出

执行上述命令后,我们将得到以下结果:

CHECK Constraint

注意:在上面的Orders表中,Article_price 列不能包含任何小于或等于零 (0) 的值。

此处包含了一个约束名称,以便关键字 CONSTRAINT后跟命名约束positive_Article_price后跟表达式。

使用 ALTER TABLE 命令为现有表定义 PostgreSQL CHECK 约束

在 PostgreSQL 中,我们可以使用ALTER TABLE命令的帮助为现有表添加 PostgreSQL CHECK Constraint。

假设我们在数据库中有一个现有表,名为Amount_list。\

CREATE TABLE Amount_list (  
    ID serial PRIMARY KEY,  
    Item_id INT NOT NULL,  
    Amount NUMERIC NOT NULL,  
    Discount NUMERIC NOT NULL,  
    Valid_from DATE NOT NULL,  
    Valid_to DATE NOT NULL  
);

输出

执行上述命令后,我们将看到以下消息窗口,显示已成功创建Amount_list\表。

CHECK Constraint

要将CHECK约束添加到Amount_list\表中,我们可以使用ALTER TABLE命令,其中Amount和Discount大于零,折扣小于金额。

注意:我们还可以使用布尔表达式,其中包括 AND 运算符。

ALTER TABLE Amount_list   
ADD CONSTRAINT Amount_Discount_check   
CHECK (  
    Amount> 0  
    AND Discount >= 0  
    AND Amount > Discount  
);

输出

执行完上面的命令后,我们会看到下面的消息窗口,显示Amount_list\表已经创建成功。

CHECK Constraint

并且Valid_to列值必须等于或大于Valid_from 列值,如以下命令所示:

ALTER TABLE Amount_list   
ADD CONSTRAINT valid_range_check   
CHECK (Valid_to >= Valid_from);

输出

在执行上述命令时,我们将检索到以下消息窗口,显示指定的表已成功修改。

CHECK Constraint

笔记

  • 如果我们放置额外的逻辑来限制值,那么 PostgreSQL Check 约束是非常有益的。
  • 并且我们还可以借助 CHECK 约束来确保数据正确高效地输入到数据库中。

概述

PostgreSQL CHECK Constraint部分,我们学习了以下主题:

  • 我们已经了解到PostgreSQL CHECK 约束用于根据布尔表达式检查列的值。
  • 我们已使用CREATE TABLE命令为特定表创建CHECK Constraint
  • 我们还可以使用ALTER TABLE修改 PostgreSQL CHECK Constraint
  • 我们在 ALTER TABLE 命令的帮助下向现有表添加了CHECK CONSTRAINT
  • 而且我们也理解了使用带有单独名称PostgreSQL Check 约束的概念。