- PostgreSQL 教程
- PostgreSQL - 首页
- PostgreSQL - 概述
- PostgreSQL - 环境设置
- PostgreSQL - 语法
- PostgreSQL - 数据类型
- PostgreSQL - 创建数据库
- PostgreSQL - 选择数据库
- PostgreSQL - 删除数据库
- PostgreSQL - 创建表
- PostgreSQL - 删除表
- PostgreSQL - 模式
- PostgreSQL - 插入查询
- PostgreSQL - 选择查询
- PostgreSQL - 运算符
- PostgreSQL - 表达式
- PostgreSQL - WHERE 子句
- PostgreSQL - AND & OR 子句
- PostgreSQL - 更新查询
- PostgreSQL - 删除查询
- PostgreSQL - LIKE 子句
- PostgreSQL - LIMIT 子句
- PostgreSQL - ORDER BY 子句
- PostgreSQL - GROUP BY
- PostgreSQL - WITH 子句
- PostgreSQL - HAVING 子句
- PostgreSQL - DISTINCT 关键字
- 高级 PostgreSQL
- PostgreSQL - 约束
- PostgreSQL - 连接
- PostgreSQL - UNION 子句
- PostgreSQL - NULL 值
- PostgreSQL - 别名语法
- PostgreSQL - 触发器
- PostgreSQL - 索引
- PostgreSQL - ALTER TABLE 命令
- TRUNCATE TABLE 命令
- PostgreSQL - 视图
- PostgreSQL - 事务
- PostgreSQL - 锁
- PostgreSQL - 子查询
- PostgreSQL - 自动递增
- PostgreSQL - 权限
- 日期/时间函数和运算符
- PostgreSQL - 函数
- PostgreSQL - 有用函数
- PostgreSQL 接口
- PostgreSQL - C/C++
- PostgreSQL - Java
- PostgreSQL - PHP
- PostgreSQL - Perl
- PostgreSQL - Python
- PostgreSQL 有用资源
- PostgreSQL - 快速指南
- PostgreSQL - 有用资源
- PostgreSQL - 讨论
PostgreSQL - 约束
约束是表上数据列强制执行的规则。这些规则用于防止将无效数据输入数据库。这确保了数据库中数据的准确性和可靠性。
约束可以是列级或表级。列级约束仅应用于一列,而表级约束则应用于整个表。为列定义数据类型本身就是一种约束。例如,DATE 类型的列将该列约束为有效日期。
以下是 PostgreSQL 中常用的约束。
NOT NULL 约束 - 确保列不能具有 NULL 值。
UNIQUE 约束 - 确保列中的所有值都不同。
PRIMARY KEY(主键) - 唯一标识数据库表中的每一行/记录。
FOREIGN KEY(外键) - 基于其他表中的列约束数据。
CHECK 约束 - CHECK 约束确保列中的所有值都满足某些条件。
EXCLUSION 约束 - 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 值。
一个表只能有一个主键,它可以包含一个或多个字段。当多个字段用作主键时,它们称为复合键。
如果表在任何字段上定义了主键,则您不能有两个记录具有该字段的相同值。
示例
您已经在上面的各种示例中看到了我们如何创建带有 ID 作为主键的 COMAPNY4 表 -
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 references COMPANY6(ID) );
CHECK 约束
CHECK 约束允许一个条件来检查输入记录的值。如果条件计算结果为假,则记录违反约束,不会输入到表中。
示例
例如,以下 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) );
EXCLUSION 约束
排除约束确保如果在指定的列或表达式上使用指定的运算符比较任意两行,则这些运算符比较中的至少一个将返回 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 <>) );
这里,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, '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;