Postgresql 简明教程
PostgreSQL - CONSTRAINTS
约束是对表中的数据列强制实施的规则。这些用于防止无效数据输入到数据库中。这确保了数据库中数据的准确性和可靠性。
约束可以是列级别或表级别。列级别约束仅应用于一列,而表级别约束应用于整个表。为列定义数据类型本身就是一种约束。例如,DATE 类型的列将列约束为有效日期。
以下是在 PostgreSQL 中常用的约束。
-
NOT NULL Constraint - 确保列不能具有 NULL 值。
-
UNIQUE Constraint − 确保列中的所有值都不同。
-
PRIMARY Key − 唯一标识数据库表中的每一行/记录。
-
FOREIGN Key − 根据其他表中的列约束数据。
-
CHECK Constraint − CHECK 约束确保列中的所有值都满足某些条件。
-
EXCLUSION Constraint − EXCLUDE 约束确保如果对指定的列或表达式使用指定的运算符对任意两行进行比较,所有这些比较都不会返回 TRUE。
NOT NULL Constraint
默认情况下,一列可以容纳 NULL 值。如果您不希望一列具有 NULL 值,则需要在此列上定义此类约束,并指定此列不再允许 NULL。NOT NULL 约束始终写为列约束。
NULL 与无数据并不相同;相反,它表示未知数据。
PRIMARY KEY Constraint
PRIMARY KEY 约束唯一标识数据库表中的每条记录。可以有更多 UNIQUE 列,但在表中只能有一个主键。在设计数据库表时,主键很重要。主键是唯一 ID。
我们用它们来指代表格行。创建表格之间的关系时,主键会成为其他表格中的外键。由于“长期的编码监督”,在 SQLite 中主键可以为 NULL。其他数据库中并非如此。
主键是表格中的一个字段,它唯一地标识数据库表格中的每一行/记录。主键必须包含唯一的值。主键列不能有 NULL 值。
一个表只能有一个主键,它可以由单个或多个字段组成。当多个字段用作主键时,它们被称为 composite key 。
如果表在任何字段上定义了主键,那么你不能让两条记录具有该字段的相同值。
FOREIGN KEY Constraint
外键约束指定列(或一组列)中的值必须与另一表格的其他行中出现的某个值匹配。我们称之为维护两个相关表格之间的引用完整性。它们被称为外键,因为这些约束是外来的,也就是说,在表格之外。外键有时称为引用键。
Example
例如,以下 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)
);
EXCLUSION Constraint
排除约束确保:如果在指定列或使用指定运算符的表达式中对任意两行进行比较,那么这些运算符比较中至少会有一个返回 false 或 null。
Example
例如,以下 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 <>)
);
其中,USING 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).