PostgreSQL - 约束

约束是对表上的数据列强制执行的规则.这些用于防止无效数据输入数据库.这可以确保数据库中数据的准确性和可靠性.

约束可以是列级别或表级别.列级约束仅应用于一列,而表级约束应用于整个表.为列定义数据类型本身就是一个约束.例如,DATE类型的列将列限制为有效日期.

以下是PostgreSQL中常用的约束.

  • NOT NULL约束 : 确保列不能具有NULL值.

  • UNIQUE Constraint : 确保列中的所有值都不同.

  • PRIMARY Key : 唯一标识数据库表中的每一行/记录.

  • FOREIGN Key : 根据其他表中的列约束数据.

  • 检查约束 :  CHECK约束确保列中的所有值都满足特定条件.

  • 排除约束 :  EXCLUDE约束确保如果使用指定的运算符在指定的列或表达式上比较任何两行,则并非所有这些比较都将返回TRUE.

NOT NULL约束

默认情况下,列可以包含NULL值.如果您不希望列具有NULL值,则需要在此列上定义此类约束,指定现在不允许该列使用NULL. NOT NULL约束总是写为列约束.

NULL与无数据不同;相反,它表示未知数据.

示例

例如,以下PostgreSQL语句创建一个名为COMPANY1的新表,并添加五列,三列其中,ID,NAME和AGE指定不接受NULL值 :

 
 CREATE TABLE COMPANY1(
 ID INT PRIMARY KEY NOT NULL,
 NAME TEXT NOT NULL,
 AGE INT NOT NULL,
 ADDRESS CHAR(50),
 SALARY REAL 
);

UNIQUE约束

UNIQUE约束可防止两个记录在特定列中具有相同的值.例如,在COMPANY表中,您可能希望阻止两个或更多人的年龄相同.

示例

例如,以下PostgreSQL语句创建一个名为COMPANY3的新表,并添加五列.这里,AGE列设置为UNIQUE,因此您不能有两个具有相同年龄的记录;

 
 CREATE TABLE COMPANY3(
 ID INT PRIMARY KEY NOT NULL,
 NAME TEXT NOT NULL,
 AGE INT NOT NULL UNIQUE,
 ADDRESS CHAR(50),
 SALARY REAL DEFAULT 50000.00 
);

PRIMARY KEY约束

PRIMARY KEY约束唯一标识数据库表中的每条记录.可以有更多UNIQUE列,但表中只有一个主键.在设计数据库表时,主键很重要.主键是唯一的ID.

我们使用它们来引用表行.在表之间创建关系时,主键成为其他表中的外键.由于"长期编码监督",SQLite中的主键可以为NULL.其他数据库不是这种情况

主键是表中的一个字段,它唯一地标识数据库表中的每一行/记录.主键必须包含唯一值.主键列不能具有NULL值.

表只能有一个主键,可以包含单个或多个字段.当多个字段用作主键时,它们被称为复合键.

如果表具有在任何字段上定义的主键,然后你不能有两个具有相同字段值的记录.

示例

你已经看过我们上面的各种例子了创建COMAPNY4表,ID为主键 :

 
 CREATE TABLE COMPANY4(
 ID INT PRIMARY KEY NOT NULL,
 NAME TEXT NOT NULL,
 AGE INT NOT NULL,
 ADDRESS CHAR(50),
 SALARY REAL 
);

FOREIGN KEY约束

外键约束指定列(或一组列)中的值必须匹配出现在另一个表的某一行中的值.我们说这维持了两个相关表之间的引用完整性.它们被称为外键,因为约束是外来的;也就是说,在桌子外面.外键有时称为引用键.

示例

例如,以下PostgreSQL语句创建一个名为COMPANY5的新表,并添加五列.

 
 CREATE TABLE COMPANY6(
 ID INT PRIMARY KEY NOT NULL,
 NAME TEXT NOT NULL,
 AGE INT NOT NULL,
 ADDRESS CHAR(50),
 SALARY REAL 
);

例如,以下PostgreSQL语句创建一个名为DEPARTMENT1的新表,它添加了三列. EMP_ID列是外键并引用表COMPANY6的ID字段.

 
 CREATE TABLE DEPARTMENT1(
 ID INT PRIMARY KEY NOT NULL,
 DEPT CHAR(50)NOT NULL,
 EMP_ID INT引用COMPANY6(ID)
);

CHECK Constraint

CHECK约束条件允许条件检查输入到记录中的值.如果条件的计算结果为false,则记录违反约束并且不会输入到表中.

示例

例如,以下PostgreSQL语句创建一个名为COMPANY5的新表,并添加五列.在这里,我们添加一个CHECK和SALARY列,这样你就不能有任何SALARY为零.

 
 CREATE TABLE COMPANY5(
 ID INT PRIMARY KEY NOT NULL,
 NAME TEXT NOT NULL,
 AGE INT NOT NULL,
 ADDRESS CHAR(50),
 SALARY REAL CHECK(SALARY> 0)
);

排除约束

排除约束确保如果使用指定的指定列或表达式比较任何两行运算符,这些运算符比较中的至少一个将返回false或null.

示例

例如,以下PostgreSQL语句创建一个名为new table的新表COMPANY7并增加了五列.在这里,我们添加一个EXCLUDE约束 :

CREATE TABLE COMPANY7(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT,
   AGE            INT  ,
   ADDRESS        CHAR(50),
   SALARY         REAL,
   EXCLUDE USING gist
   (NAME WITH =,
   AGE WITH <>)
);

此处, USING gist 是构建和用于执行的索引类型.

你需要为每个数据库执行一次命令 CREATE EXTENSION btree_gist .这将安装btree_gist扩展,它定义了普通标量数据类型的排除约束.

由于我们已强制执行年龄必须相同,让我们通过向表中插入记录来看到这一点 :

 
 INSERT INTO COMPANY7 VALUES(1,'Paul',32,'California',20000.00); 
 INSERT INTO COMPANY7 VALUES(2,'Paul',32,'Texas',20000.00); 
 INSERT INTO COMPANY7 VALUES(3,'Allen',42,'California',20000.00);

对于前两个INSERT语句,记录将添加到COMPANY7表中.对于第三个INSERT语句,显示以下错误 :

ERROR:  duplicate key value violates unique constraint "company7_pkey"
DETAIL:  Key (id)=(3) already exists.

删除约束

要删除约束,您需要知道它的名称.如果名称已知,则很容易丢弃.否则,您需要找出系统生成的名称. psql命令\d表名在这里很有帮助.一般语法是 :

ALTER TABLE table_name DROP CONSTRAINT some_name;