主键是唯一标识每条记录的字段,如学号;外键是关联其他表主键的字段,用于验证数据一致性。主键确保唯一非空,外键确保引用真实存在,二者配合实现数据完整性约束。

想在班级花名册里快速找到“穿蓝衣服、戴眼镜、坐第三排的李明”,结果发现班里有三个李明——这时候你真正需要的不是外貌描述,而是一个谁也复制不了的学号;外键就像班长手里那张写着“学号→对应人”的对照表,它不自己编号,只负责核对编号是否真实存在。
主键:给每条记录发一张身份证
第一步:打开学生信息表,观察字段——姓名、年龄、班级、学号。其中“学号”这一列每个值都不同,且没有空着的行。
第二步:把“学号”设为主键。MySQL执行语句:ALTER TABLE students ADD PRIMARY KEY (student_id);
这一步不能跳过,因为【没有主键的表无法被其他表安全引用】。就像没发身份证的人,派出所没法确认他是不是真住在本辖区。
第三步:尝试插入两条学号相同的记录,数据库会立刻报错Duplicate entry '2025001' for key 'PRIMARY'——这就是主键在拦住错误数据。
外键:让选课表认得清谁是真学生
方法一:建表时直接定义外键
创建选课表时,在字段定义末尾加上:FOREIGN KEY (student_id) REFERENCES students(student_id)。这样MySQL就记住:“选课表里的student_id,必须在学生表里真实存在”。
方法二:给已有表添加外键约束
先确保选课表中student_id字段类型和学生表完全一致(比如都是INT UNSIGNED),再执行:ALTER TABLE enrollments ADD CONSTRAINT fk_student FOREIGN KEY (student_id) REFERENCES students(student_id);
注意:如果选课表里已经存了学生表中不存在的学号,这一步会失败。必须先清理脏数据。
一个动作看清主键和外键怎么配合
① 删除学生表中某位学生的记录(比如学号2025007);
② 此时再去查选课表,发现所有student_id = 2025007的记录依然存在;
③ 但如果你在建外键时加了ON DELETE CASCADE,那么第①步执行后,第②步的数据会自动消失——外键不是摆设,它能主动联动。
这说明外键本身不存储身份信息,它只是个“验证员”:你填的学号,它去学生表翻一遍,有就放行,没有就拒绝插入或报错。

















