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 表示子表引用了父表不存在的值,插入顺序必须是先父表后子表。