主键和外键是建表时必须设定的硬约束:主键唯一标识每行且非空,外键确保从表数据引用主表存在记录,配合实现插入校验、删除拦截、级联更新等完整性保护。

你想在数据库里把学生信息和他们的选课记录连起来,又怕删错数据导致订单找不到客户、课程找不到老师——主键和外键就是管这事的两把锁,不是可选项,是建表时就必须想清楚的硬约束。
主键:给每条记录发一张身份证
第一步:打开建表语句,在字段定义后面加上 【PRIMARY KEY】,比如 student_id INT PRIMARY KEY。
这一步必须做,否则数据库不会强制校验唯一性和非空性,后续所有关联都可能出错。
第二步:确保该字段不写 NULL,也不设默认值为 NULL,因为主键绝不允许为空。
第三步:如果用多个字段组合当主键(比如「课程编号+学期」一起唯一标识一门开课记录),就写成 PRIMARY KEY (course_id, semester),括号里字段顺序不能颠倒,会影响索引效率。
外键:在另一张表里贴上“归属标签”
方法一:建表时直接声明
在创建从表(比如订单表、选课表)时,把关联字段写成外键:FOREIGN KEY (student_id) REFERENCES students(student_id)。
注意:被引用的 students(student_id) 必须已是主键或有唯一约束,否则 MySQL 会报错拒绝建表。
方法二:已有表补加外键
先确认两张表引擎都是 InnoDB(MyISAM 不支持外键),再执行:ALTER TABLE enrollments ADD CONSTRAINT fk_stu_id FOREIGN KEY (student_id) REFERENCES students(student_id);
这一步失败常见原因是:enrollments 表里已有 student_id 值在 students 表中不存在,得先清理脏数据再加。
主键和外键怎么配合防出错
① 插入新记录时,数据库先查主表有没有这个主键值——没有就直接拒绝插入外键字段;
② 删除主表某行前,数据库检查从表是否还有外键指向它——有且没设级联时,删操作会被拦住;
③ 更新主表主键值时,若从表外键设了 ON UPDATE CASCADE,对应从表记录会自动同步更新,否则会报错;
④ 【外键字段允许为 NULL,但主键字段绝对不允许】——这是二者最直观的行为分界线。











