PostgreSQL 约束(Constraints)详解
PostgreSQL约束(Constraints)用于确保数据库数据的完整性和一致性。PostgreSQL 提供了多种约束类型,包括 NOT NULL、UNIQUE、PRIMARY KEY、FOREIGN KEY、CHECK、DEFAULT 和 EXCLUSION 约束。
1. NOT NULL 约束
用于确保某列的值不能为 NULL,适用于关键数据字段。
1.1 语法
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
1.2 示例
INSERT INTO users (id, name) VALUES (1, NULL);
-- 报错:违反 NOT NULL 约束
1.3 删除 NOT NULL 约束
ALTER TABLE users ALTER COLUMN name DROP NOT NULL;
2. UNIQUE 约束
确保某列或多个列的值在表中是唯一的。
2.1 语法
CREATE TABLE users (
id SERIAL PRIMARY KEY,
email VARCHAR(255) UNIQUE
);
2.2 复合 UNIQUE 约束
CREATE TABLE employees (
first_name VARCHAR(50),
last_name VARCHAR(50),
UNIQUE (first_name, last_name)
);
2.3 违反 UNIQUE 约束示例
INSERT INTO users (email) VALUES ('user@example.com');
INSERT INTO users (email) VALUES ('user@example.com');
-- 报错:违反 UNIQUE 约束
2.4 删除 UNIQUE 约束
ALTER TABLE users DROP CONSTRAINT users_email_key;
3. PRIMARY KEY 约束
PRIMARY KEY 约束由 UNIQUE 和 NOT NULL 组合而成,每张表只能有一个主键。
3.1 语法
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
order_number VARCHAR(50) NOT NULL UNIQUE
);
3.2 复合主键
CREATE TABLE order_items (
order_id INT,
product_id INT,
PRIMARY KEY (order_id, product_id)
);
3.3 删除 PRIMARY KEY
ALTER TABLE orders DROP CONSTRAINT orders_pkey;
4. FOREIGN KEY 约束
FOREIGN KEY 约束用于维护表与表之间的关系,确保引用的值在父表中存在。
4.1 语法
CREATE TABLE users (
id SERIAL PRIMARY KEY
);
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
user_id INT REFERENCES users(id) ON DELETE CASCADE
);
4.2 级联删除(ON DELETE CASCADE)
如果 users 表的某条记录被删除,orders 表中关联的数据也会被删除。
DELETE FROM users WHERE id = 1;
-- 该用户的所有订单也会被删除
4.3 删除 FOREIGN KEY
ALTER TABLE orders DROP CONSTRAINT orders_user_id_fkey;
5. CHECK 约束
CHECK 约束用于限制列的值符合某个条件。
5.1 语法
CREATE TABLE products (
id SERIAL PRIMARY KEY,
price DECIMAL CHECK (price > 0)
);
5.2 复杂 CHECK 约束
CREATE TABLE employees (
id SERIAL PRIMARY KEY,
age INT CHECK (age >= 18 AND age <= 65)
);
5.3 违反 CHECK 约束示例
INSERT INTO employees (age) VALUES (17);
-- 报错:违反 CHECK 约束
5.4 删除 CHECK 约束
ALTER TABLE employees DROP CONSTRAINT employees_age_check;
6. DEFAULT 约束
用于指定默认值。
6.1 语法
CREATE TABLE users (
id SERIAL PRIMARY KEY,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
6.2 使用 DEFAULT
INSERT INTO users (id) VALUES (1);
SELECT * FROM users;
-- created_at 将自动填充当前时间
6.3 修改 DEFAULT
ALTER TABLE users ALTER COLUMN created_at SET DEFAULT NOW();
6.4 删除 DEFAULT
ALTER TABLE users ALTER COLUMN created_at DROP DEFAULT;
7. EXCLUSION 约束
EXCLUSION 约束用于确保数据范围或表达式的唯一性,常用于 RANGE 数据类型。
7.1 语法
CREATE TABLE room_reservations (
id SERIAL PRIMARY KEY,
room_id INT,
period TSRANGE,
EXCLUDE USING GIST (room_id WITH =, period WITH &&)
);
7.2 作用
room_id WITH =确保room_id不能重复。period WITH &&确保时间范围不能重叠。
7.3 删除 EXCLUSION 约束
ALTER TABLE room_reservations DROP CONSTRAINT room_reservations_exclusion;
8. 添加、删除和修改约束
8.1 添加 NOT NULL 约束
ALTER TABLE users ALTER COLUMN name SET NOT NULL;
8.2 添加 UNIQUE 约束
ALTER TABLE users ADD CONSTRAINT unique_email UNIQUE (email);
8.3 添加 CHECK 约束
ALTER TABLE employees ADD CONSTRAINT check_age CHECK (age >= 18);
8.4 删除约束
ALTER TABLE users DROP CONSTRAINT unique_email;
总结
| 约束类型 | 作用 |
|---|---|
NOT NULL | 确保列值不能为空 |
UNIQUE | 确保列值唯一 |
PRIMARY KEY | 唯一且非空,每个表只能有一个 |
FOREIGN KEY | 维护表之间的关系 |
CHECK | 限制列值的范围或条件 |
DEFAULT | 指定列的默认值 |
EXCLUSION | 确保数据范围或表达式的唯一性 |
更多详细内容请关注其他相关文章!