在创建表时定义外键:

CREATE TABLE 子表 ( 列1 数据类型, 列2 数据类型, ... FOREIGN KEY (外键列) REFERENCES 父表(主键列) [ON DELETE 约束行为] [ON UPDATE 约束行为]);
在已有表中添加外键:
ALTER TABLE 子表ADD CONSTRAINT 约束名称FOREIGN KEY (外键列) REFERENCES 父表(主键列)[ON DELETE 约束行为] [ON UPDATE 约束行为];
当父表的记录被删除或更新时,子表的外键如何处理?通过 ON DELETE 和 ON UPDATE 指定:
| 约束行为 | 说明 |
|---|---|
| CASCADE | 级联操作。父表删除/更新记录时,子表关联记录也被删除/更新。 |
| SET NULL | 父表删除/更新记录时,子表的外键列设为 NULL(要求外键列允许 NULL)。 |
| NO ACTION | 默认行为。阻止父表的删除/更新操作,如果子表存在关联记录。 |
| RESTRICT | 类似 NO ACTION,立即检查约束。 |
| SET DEFAULT | 父表删除/更新记录时,子表的外键设为默认值(需定义默认值)。 |
外键可以由多个列组成,需满足:
示例:
CREATE TABLE 订单详情 ( 订单ID INT, 产品ID INT, 数量 INT, PRIMARY KEY (订单ID, 产品ID), FOREIGN KEY (订单ID) REFERENCES 订单(订单ID), FOREIGN KEY (产品ID) REFERENCES 产品(产品ID));
场景:学生表(students)和课程表(courses),通过选课表(enrollments)关联。
-- 父表:学生表CREATE TABLE students ( student_id INT PRIMARY KEY, name VARCHAR(50));-- 父表:课程表CREATE TABLE courses ( course_id INT PRIMARY KEY, course_name VARCHAR(50));-- 子表:选课表(含外键)CREATE TABLE enrollments ( student_id INT, course_id INT, enrollment_date DATE, FOREIGN KEY (student_id) REFERENCES students(student_id) ON DELETE CASCADE, FOREIGN KEY (course_id) REFERENCES courses(course_id) ON DELETE RESTRICT);
插入数据:
-- 插入学生和课程INSERT INTO students VALUES (1, 'Alice');INSERT INTO courses VALUES (101, 'Math');-- 合法插入:学生和课程存在INSERT INTO enrollments VALUES (1, 101, '2023-10-01');-- 非法插入:学生不存在,触发外键错误INSERT INTO enrollments VALUES (999, 101, '2023-10-01'); -- 报错!
外键必须指向主键吗?
不,可以指向父表的唯一约束(Unique Constraint)。
能否跨数据库引用?
通常不支持,外键需在同一数据库内。
外键是否允许 NULL?
如果外键列允许 NULL,则插入 NULL 是合法的(表示无关联)。
如何查看外键约束?
使用数据库工具或查询元数据(如 MySQL 的 SHOW CREATE TABLE)。