📜  PostgreSQL约束

📅  最后修改于: 2020-12-01 00:55:32             🧑  作者: Mango

PostgreSQL约束

约束用于描述表中数据列的规则。如果约束和数据操作之间存在任何破坏,则该操作将立即终止。约束条件确保了数据库中数据的可靠性和正确性。

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

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

我们在哪里使用约束?

约束最常用于以下领域:

  • 创建之后,可以将其添加到表中,也可以暂时将其禁用。
  • 对于单个列,我们可以使用列约束。
  • 在创建表的帮助下创建表时,我们也可以声明约束
  • SQL可以舍弃任何中断明确定义的条件的值。
  • 与约束有关的所有信息都保存在数据字典中。
  • 对于一个或多个列,我们可以使用表约束。
  • 为所有约束分配一个名称。

PostgreSQL约束类型

让我们看看PostgreSQL中最常用的约束:

Constraints Description
Not Null This type of constraint is used to make sure that a column cannot have a null value. And no name can be further defined to generate a not-null constraint.
Check It is used to make sure that all values in a column or a field of a table satisfy particular situations such as it must match a Boolean expression. The Check constraint can be defined by a separate name.
Unique The unique constraints are used to make sure that all values in a column of a table are exclusive.
Primary key The primary key is to specify each row or record in a database table uniquely and make sure that there is no record duplicity in a particular table.
Foreign key In PostgreSQL, the foreign key is used to define that the value in a column or field of a table is equal to the real value of the primary key of another table.
Exclusion This constraint is used to make sure that any two rows are linked on the precise columns or statements with the help of defined operators, and one of these operator assessments should return either Null or False.

NOT NULL约束

在非null约束中,默认情况下,列可以容纳Null值。如果我们不希望一列具有NULL值,那么我们需要解释此列状态的约束,即该特定列现在不接受NULL。它始终被创建为列约束,它表示未知数据,但这并不意味着该数据将为null。

例如

在以下情况下,我们将创建一个名为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中看到以上查询:

说明

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

表结构

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

检查约束

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

例如

在下面的示例中,我们将创建一个名为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查询

说明

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

表结构

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

独特的约束

唯一约束用于维持我们存储到表的字段或列中的值的个性。它与一组列约束或列约束以及表约束兼容。

当我们使用唯一约束时,将自动生成一个或多个列上的索引。如果我们将两个不同的null值添加到不同行的列中,但不会中断UNIQUE约束的指定。

例如

在下面的示例中,我们将创建一个名为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查询

说明

上面的示例Cust_Age列设置为UNIQUE;因此,我们可以避免两个或多个人的年龄相同。

表结构

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

主键约束

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

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

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

在下面的示例中,我们将创建一个名为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查询

说明

上面的示例Employee表是用一个主键Emp_Id列创建的,它唯一表示雇员id。

表结构

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

外键约束

它是一组列,其值取决于另一个表的主键收益。它用于在一个列或一组列中具有值,这些值必须显示在另一个表的同一列或列组合中。

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

例如

在下面的示例中,我们将创建一个名为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查询

表结构

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

排除约束

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

例如

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

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 <>)
);

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

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

btree_gist命令,一次在数据库中。然后,它将连接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表中,如下面的屏幕快照所示:

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

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).

PgAdmin4中的SQL查询

放下约束

如果要删除约束,则应该记住约束的名称,因为我们更容易直接通过其名称删除约束。否则,我们将需要识别系统生成的名称。

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

\d table name

删除约束的语法如下:

ALTER TABLE table_name DROP CONSTRAINT some_name;