约束与表关系
掌握六大约束的定义与作用
理解主键、外键与表关系
能设计一对一、一对多、多对多表结构
核心讲解
(1)六大约束
约束是对表中数据的规则限制,保证数据的正确性和完整性。
表格
约束 | 作用 |
|---|---|
PRIMARY KEY | 主键,唯一且非空,一张表只能一个 |
FOREIGN KEY | 外键,引用其他表的主键,保证引用完整性 |
UNIQUE | 唯一约束,值不能重复 |
NOT NULL | 非空约束,值不能为 NULL |
CHECK | 检查约束,满足条件才能插入 |
DEFAULT | 默认值,不赋值时用默认值 |
(2)三种表关系
一对一:一个 A 对应一个 B,外键加唯一约束。比如:用户和用户详情
一对多:一个 A 对应多个 B,外键在多的那边。比如:班级和学生
多对多:A 对应多个 B,B 也对应多个 A,需要中间关系表。比如:学生和课程
(3)外键的作用
保证引用完整性,不能插入不存在的外键值
默认不能删除被引用的主表记录
可以设置级联删除 / 更新:
ON DELETE CASCADE
代码示例
-- 班级表(一的一方)
CREATE TABLE class (
id serial PRIMARY KEY,
class_name varchar(50) UNIQUE NOT NULL,
teacher varchar(50)
);
-- 学生表(多的一方),外键关联班级
CREATE TABLE student (
id serial PRIMARY KEY,
name varchar(50) NOT NULL,
class_id int REFERENCES class(id) -- 外键,引用班级表主键
);
-- 插入班级
INSERT INTO class(class_name, teacher) VALUES
('一班', '王老师'),
('二班', '李老师');
-- 插入学生
INSERT INTO student(name, class_id) VALUES
('张三', 1),
('李四', 1),
('王五', 2);
-- ===== 多对多 =====
-- 课程表
CREATE TABLE course (
id serial PRIMARY KEY,
course_name varchar(50) NOT NULL
);
-- 学生课程中间表
CREATE TABLE student_course (
id serial PRIMARY KEY,
student_id int REFERENCES student(id) ON DELETE CASCADE,
course_id int REFERENCES course(id) ON DELETE CASCADE,
UNIQUE(student_id, course_id) -- 联合唯一
);
INSERT INTO course(course_name) VALUES ('语文'),('数学'),('英语');
INSERT INTO student_course(student_id, course_id) VALUES
(1,1), (1,2),
(2,2), (2,3);
常见误区
外键降低性能:适当的外键保证数据完整性,性能影响很小,比出脏数据代价小太多
多对多不用中间表:必须用中间表,两个外键分别关联主表
联合主键代替自增主键:推荐用自增主键 + 唯一约束,不要用联合主键
CHECK 没用:PG 的 CHECK 是真正生效的,不像 MySQL 早期版本不执行
课后练习
创建部门表和员工表,一对多关系
添加外键约束,设置级联删除
设计权限系统:用户、角色、权限,多对多关系
思考:外键的优缺点分别是什么?

