5. 表的约束(保证数据不胡来)
约束用来限制字段里能放什么数据,是数据质量的"守门员"。
| 约束 | 关键字 | 作用 | 示例 |
|---|---|---|---|
| 主键 | PRIMARY KEY | 唯一标识一行,不能重复不能为空 | 学号 Sno |
| 非空 | NOT NULL | 该字段必须填值 | 姓名 Sname |
| 唯一 | UNIQUE | 值不能重复(但可多个 NULL) | 身份证 IDNum |
| 默认 | DEFAULT | 不填时自动用默认值 | 班级默认'01' |
| 外键 | FOREIGN KEY | 关联另一张表,保证引用合法 | sc.Sno 引用 student.Sno |
主键常写成:
sql
PRIMARY KEY (Sno) -- 单字段主键
PRIMARY KEY (Sno, Cno) -- 复合主键(选课表 sc 用学号+课程号)⚠️ 外键(FOREIGN KEY)保证"引用的数据必须存在"。例如 sc 表的 Sno 必须在 student 表中存在,否则插入会报错。它能防止出现"成绩指向一个不存在的学生"这种脏数据。
📝 本节例题
以下例题均基于 教学实例 库(student / course / sc / teacher / grades / dept / emp),开始前先执行 USE 教学实例;。建议先自己写一遍,再展开答案对照。
例 1
建 course_demo 表:课程号为主键,课程名不允许为空。
查看参考答案(可复制)
sql
CREATE TABLE course_demo (
Cno varchar(10) PRIMARY KEY,
Cname varchar(10) NOT NULL,
Tno varchar(10)
);💡 主键自带非空 + 唯一,不用再写 NOT NULL。
例 2
建 student_demo 表:学号主键、身份证号唯一、性别默认'男'。
查看参考答案(可复制)
sql
CREATE TABLE student_demo (
Sno varchar(10) PRIMARY KEY,
Sname varchar(10),
IDNum char(18) UNIQUE,
Ssex varchar(10) DEFAULT '男'
);💡 UNIQUE 允许空值但不允许重复;DEFAULT 只对省略该列的 INSERT 生效。
例 3
emp 表的 dept_id 已设有外键引用 dept(id)。试着插入一名 dept_id=99 的员工,观察报错;再改成合法部门号重新插入。
查看参考答案(可复制)
sql
-- 先看看 dept 里有哪些部门
SELECT * FROM dept;
-- 部门号 99 不存在,会报 1452 外键错误
INSERT INTO emp(name, age, job, salary, entrydate, dept_id)
VALUES('测试员工', 20, '开发', 6000, '2025-01-01', 99);
-- 改成合法部门号
INSERT INTO emp(name, age, job, salary, entrydate, dept_id)
VALUES('测试员工', 20, '开发', 6000, '2025-01-01', 1);💡 错误 1452 表示子表引用了父表不存在的值,插入顺序必须是先父表后子表。