📅  最后修改于: 2020-11-26 06:26:57             🧑  作者: Mango
约束是对表的数据列强制执行的规则。这些用于防止将无效数据输入数据库。这样可以确保数据库中数据的准确性和可靠性。
约束可以是列级别或表级别。列级约束仅应用于一列,而表级约束则应用于整个表。定义列的数据类型本身就是一个约束。例如,类型为DATE的列将其约束为有效日期。
以下是PostgreSQL中可用的常用约束。
NOT NULL约束-确保列不能具有NULL值。
唯一约束-确保列中的所有值都不同。
PRIMARY键-唯一标识数据库表中的每一行/记录。
FOREIGN键-根据其他表中的列约束数据。
CHECK约束-CHECK约束可确保列中的所有值均满足某些条件。
EXCLUSION约束-EXCLUDE约束确保如果使用指定的运算符在指定的列或表达式上比较任何两行,则并非所有这些比较都将返回TRUE。
默认情况下,列可以保存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约束可防止两个记录在特定列中具有相同的值。例如,在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约束唯一地标识数据库表中的每个记录。可以有更多的UNIQUE列,但表中只有一个主键。在设计数据库表时,主键很重要。主键是唯一的ID。
我们使用它们来引用表行。在表之间创建关系时,主键成为其他表中的外键。由于“长期的编码监督”,SQLite中的主键可以为NULL。其他数据库则不是这样
主键是表中的字段,它唯一地标识数据库表中的每一行/记录。主键必须包含唯一值。主键列不能具有NULL值。
一个表只能有一个主键,它可以由单个或多个字段组成。当多个字段用作主键时,它们称为复合键。
如果表在任何字段上定义了主键,则不能有两个记录具有与该字段相同的值。
您已经在上面看到了很多示例,其中我们创建了ID为主键的COMAPNY4表-
CREATE TABLE COMPANY4(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
外键约束指定一列(或一组列)中的值必须与另一个表的某一行中出现的值匹配。我们说这保持了两个相关表之间的参照完整性。之所以称为外键,是因为约束是外键。也就是说,在桌子外面。外键有时称为引用键。
例如,以下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 references COMPANY6(ID)
);
CHECK Constraint使条件能够检查输入到记录中的值。如果条件评估为假,则记录违反约束,并且不输入表中。
例如,以下PostgreSQL语句创建一个名为COMPANY5的新表并添加五列。在这里,我们添加了一个带有SALARY的CHECK列,因此您不能将任何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语句创建一个名为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 <>)
);
在这里,使用要点是要建立和用于执行的索引的类型。
您需要对每个数据库执行一次命令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, 'Paul', 42, 'California', 20000.00 );
对于前两个INSERT语句,记录将添加到COMPANY7表中。对于第三条INSERT语句,显示以下错误-
ERROR: conflicting key value violates exclusion constraint "company7_name_age_excl"
DETAIL: Key (name, age)=(Paul, 42) conflicts with existing key (name, age)=(Paul, 32).
要删除约束,您需要知道其名称。如果名称已知,很容易删除。否则,您需要找出系统生成的名称。 psql命令\ d表名在这里可能会有所帮助。通用语法是-
ALTER TABLE table_name DROP CONSTRAINT some_name;