PostgreSQL Constraints


PostgreSQL Constraints

Constraints用于描述表中数据列的规则。如果Constraints和数据动作之间有任何破坏,则动作立即终止。Constraints保证了数据库中数据的可靠性和正确性。

在本节中,我们将讨论所有PostgreSQL Constraints

Constraints可以进一步分为列级或表级,其中表级Constraints用于整个表,而列级Constraints仅用于一列

我们在哪里使用Constraints?

Constraints最常用于以下领域:

  • 一旦创建,就可以将其添加到表中,我们也可以暂时禁用它。
  • 对于单个列,我们可以使用列Constraints。
  • 当我们在创建命令的帮助下创建表时,我们也可以声明Constraints
  • SQL 可以丢弃任何中断明确定义的标准的值。
  • 所有与Constraints相关的信息都保存在数据字典中。
  • 对于一列或多列,我们可以使用表Constraints。
  • 所有Constraints都分配了一个名称。

PostgreSQL Constraints的类型

让我们看看PostgreSQL 中最常用的Constraints:

PostgreSQL Constraints

Constraints 描述
Not Null 这种类型的Constraints用于确保列不能NULL值。并且不能进一步定义名称来生成非空Constraints。
Check 它用于确保表的列或字段中的所有值满足特定情况,例如它必须匹配布尔表达式。Check Constraints可以由单独的名称定义。
Unique 唯一Constraints用于确保表的列中的所有值都是互斥的。
Primary key 主键是唯一指定数据库表中的每一行或记录,并确保特定表中没有记录重复。
Foreign key 在 PostgreSQL 中,外键用于定义一个表的列或字段中的值等于另一个表的主键的实际值。
Exclusion 此Constraints用于确保在定义的运算符的帮助下将任何两行链接到精确的列或语句,并且这些运算符评估之一应返回Null 或 False。

非空Constraints

在非空Constraints中,默认情况下,列可以保存Null值。如果我们不希望一列有 NULL 值,那么我们需要解释对这个列状态的这种Constraints,即现在该特定列不能接受 NULL。它始终作为列Constraints创建,它代表未知数据,但并不意味着数据将为空。

例如

在下面的例子中,我们创建了一个名为Customer的新表,它有五列,例如Cust_Id、Cust_Name、Cust_Address、Cust_Age 和 Cust_Salary

CREATE TABLE Customer(  
Cust_Id INT PRIMARY KEY NOT NULL,  
Cust_Name TEXT NOT NULL,   
Cust_Address CHAR(50),  
Cust_Age INT NOT NULL,  
Cust_Salary REAL  
);

PgAdmin4 中的 SQL 查询

在下面的截图中,我们可以在 pgAdmin4 中看到上面的查询:

PostgreSQL Constraints

解释

上面的示例显示已创建表Customer,其中Cust_Id、Cust_Name 和 Cust_Age列被指定为不接受值。

表结构

执行select命令后,我们可以看到Customer表的表结构。

PostgreSQL Constraints

检查Constraints

在 PostgreSQL 中,Check Constraints可以由单独的名称定义。它用于控制插入的列的值。它允许我们验证存储到记录中的值的条件。如果该语句为假,则数据会破坏Constraints并且不会保存到表中。

例如

在下面的示例中,我们创建了一个名为Customer2的新表,该表包含五列

CREATE TABLE Customer2(  
Cust_Id INT PRIMARY KEY NOT NULL,  
Cust_Name TEXT NOT NULL,   
Cust_Address CHAR(30),  
Cust_Age INT NOT NULL,  
Cust_Salary REAL check (Cust_Salary>0)  
);

PgAdmin4 中的 SQL 查询

PostgreSQL Constraints

解释

在上面的示例中,我们在表Customer2 中添加了带有Cust_SALARY列的CHECK,其中Cust_Salary列不能包含任何小于或等于零 (0) 的值

表结构

执行select命令后,我们可以看到Customer2表的表结构。

PostgreSQL Constraints

唯一Constraints

唯一Constraints是用来维护值的个性,我们存储到一个字段或表中的列。它与一组列Constraints或列Constraints和一个表Constraints兼容。

当我们使用唯一Constraints时,一个或多个列上的索引会自动生成。如果我们将两个不同的空值添加到不同行的列中,但不会中断UNIQUEConstraints的规范。

例如

在下面的示例中,我们将创建一个名为Customer3的新表,它具有与我们在上表中创建的类似的五列。

CREATE TABLE Customer3(  
Cust_Id INT PRIMARY KEY NOT NULL,  
Cust_Name TEXT NOT NULL,   
Cust_Address CHAR(30),  
Cust_Age INT NOT NULL Unique,  
Cust_Salary REAL default 20000.00  
);

PgAdmin4 中的 SQL 查询

PostgreSQL Constraints

解释

上面的例子,Cust_Age列,被设置为UNIQUE;因此,我们可以避免两个或两个以上年龄相同的人的口是心非。

表结构

执行select命令后,我们可以看到Customer3表的表结构。

PostgreSQL Constraints

主键Constraints

它是表中的一个字段,用于单独标识数据库表中的每一行或记录,并且它包含一个唯一值。主键不包含任何空值。为此,我们也可以说主键是表的唯一**Constraints非空Constraints**的集合。

它用于区别地标识数据库表中的每条记录。在这里,我们可以包含更多的唯一列,但我们在数据库表中只有一个主键,并且包括单个或多个字段。它是创建数据库表时最关键的键,它可以是唯一的 ID。它可以表示一列或一组列。

主键的工作类似于唯一Constraints。尽管如此,它们之间的显着区别是一张表只能有一个主键;但是,该表可以具有一个或多个唯一非空的Constraints。

例子

在下面的示例中,我们创建了一个名为Employee的新表,其中包含四列,例如Emp_Id、Emp_Name、Emp_Address 和 Emp_Age

CREATE TABLE Employee(  
Emp_Id INT PRIMARY KEY NOT NULL,  
Emp_Name TEXT NOT NULL,   
Emp_Address CHAR(30),  
Emp_Age INT NOT NULL  
);

PgAdmin4 中的 SQL 查询

PostgreSQL Constraints

解释

上面的例子,Employee表,已经创建了一个主键作为 Emp_Id列,它唯一地代表了员工 id

表结构

执行Select命令后,我们可以看到Employee表的表结构。

PostgreSQL Constraints

外键Constraints

它是一组具有依赖于另一个表的主键的值的列。它用于具有必须显示在另一个表中的同一列或列组合中的一列或一组列中的值。

在 PostgreSQL 中,外键的值与另一个表中主键的实际值平行;这就是为什么它也被称为参照完整性Constraints

例如

在下面的示例中,我们创建了一个名为Employee1的新表,其中包含与上一个表类似的四列。

CREATE TABLE Employee1(  
Emp_Id INT PRIMARY KEY NOT NULL,  
Emp_Name TEXT NOT NULL,   
Emp_Address CHAR(30),  
Emp_Age INT NOT NULL  
);

在此特定示例中,我们将再创建一个名为cust 的表,其中包含三。而且,在这里,我们创建一个外键CUST_ID列,其中引用EMP_ID字段中Employee1表。

CREATE TABLE cust(  
Emp_Id INT PRIMARY KEY NOT NULL,  
Cust CHAR(50) NOT NULL,  
Cust_Id INT references Employee1(Emp_Id)  
);

PgAdmin4 中的 SQL 查询

PostgreSQL Constraints

表结构

在这里,我们可以看到Cust表的表结构,它是对Employee1表的引用。

PostgreSQL Constraints

排除Constraints

它用于确保使用定义的运算符在指定的列或语句上链接任何两行。在任何情况下,这些运算符评估之一将返回 null 或 false。

例如

在下面的示例中,我们创建了一个名为Employee的新表,其中包含五列。在这里,我们也将使用排除Constraints。

CREATE TABLE Employee3(  
Emp_Id INT PRIMARY KEY  NOT NULL,  
Emp_Name  TEXT,  
Emp_Address CHAR(50),  
Emp_Age INT,  
Emp_SALARY REAL,  
EXCLUDE USING gist (Emp_Name WITH =,Emp_Age WITH <>)  
);

现在,对于排除Constraints, ¬我们将使用using gist,它是索引,用于创建和实现。

注意:如果我们使用排除Constraints,我们必须运行 create 扩展

btree_gist命令,一次在数据库中。之后,它将连接定义基本标量数据类型Constraints的btree_gist 扩展

CREATE EXTENSION btree_gist;

现在,我们将在Employee3表中插入一些记录,并且我们也施加了类似的年龄。

前两个插入命令将成功执行。

INSERT INTO Employee3 VALUES(101, 'john','Newyork',22, 30000.00 );  
INSERT INTO Employee3 VALUES(102, 'john','Florida',22, 30000.00 );

并将记录添加到Employee3表中,如下面的屏幕截图所示:

PostgreSQL Constraints

但是对于第三个插入命令,我们可能会遇到如下错误:

INSERT INTO Employee3 VALUES(103, 'john', 'Newyork', 32, 30000.00 );  
ERROR: conflicting key value violates exclusion constraint "employee2_emp_name_emp_age_excl" DETAIL: Key (emp_name, emp_age)=(john, 32) conflicts with existing key (emp_name, emp_age)=(john, 22).

PostgreSQL Constraints

PgAdmin4 中的 SQL 查询

PostgreSQL Constraints

删除Constraints

如果我们想删除一个Constraints,那么我们应该记住Constraints的名称,因为我们可以更容易地直接通过其名称删除Constraints。否则,我们将要求识别系统生成的名称。

psql 中,可以使用以下命令来查找名称。

\d table name

删除Constraints的语法如下:

ALTER TABLE table_name DROP CONSTRAINT some_name;