外键约束
外键约束,用于规定表中指定字段取值只能是依赖表的记录中的主键或唯一字段的值,不能为其它值。
语法格式
sql
foreign_constriant_stmt::=
[CONSTRAINT name] FOREIGN KEY opt_fk_name REFERENCES name_space [(index_col_name,...)] [key_actions]
key_actions::=
ON UPDATE {CASCADE | SET NULL | NO ACTION | SET DEFAULT}
| ON DELETE {CASCADE | SET NULL | NO ACTION | SET DEFAULT}
| /*empty*/
参数说明
[CONSTRAINT name]
:可选关键字,用于指定外键约束的名称。FOREIGN KEY
:关键字,用于定义外键约束。opt_fk_name
:指定外键的名称。REFERENCES name_space [(index_col_name,...)]
:指定引用的目标表和列。key_actions
:外键约束的反向规则描述子句,当被引用的表(父表)发生记录更改或删除时,引用表(子表)中引用了父表中发生更改的记录的字段值的记录将不再符合约束条件,此时,系统将根据外键约束规则对子表记录重新设置值、置空或不进行操作而报错。NO ACTION
:当父表记录变更时,导致子表中某些记录不再满足外键约束,系统将禁止父表作变更,其效果为更改父表的事务将被回滚。CASCADE
:当父表记录变更时子表受影响记录的相应字段值随之变更,当父表记录删除时,子表中受影响记录跟着删除。SET NULL
:父表更改或删除,子表记录的相应字段值置为空值。SET DEFAULT
:父表更改或删除时,子表相应记录的相应字段值置为默认值,若该字段无默认值则置空。
示例
表teacher用于记载学校中所有教师的基本情况,另一张表course用于记载学校所有的课程安排,course中一个字段用于表示某门课程的授课教师。若该库在逻辑上是完整一致的,则course中用于表示授课教师的字段的取值都应在表teacher中出现,否则,说明表course中某记录的表示授课教师的字段的取值错误,或者表teacher并未完全包含所有教师的信息。
为防止此类错误的出现,可以在创建表course时设定外键约束,令表course中的授课教师字段引用表teacher中的教师姓名字段。
sql
-- 创建teacher表,teacher_name作为主键
CREATE TABLE teacher (
teacher_name VARCHAR(255) PRIMARY KEY,
teacher_age INT
);
-- 插入数据
INSERT INTO teacher (teacher_name, teacher_age) VALUES ('He', 35);
INSERT INTO teacher (teacher_name, teacher_age) VALUES ('Wang', 40);
INSERT INTO teacher (teacher_name, teacher_age) VALUES ('Zhang', 38);
-- 创建course表,添加外键约束引用teacher_name字段
CREATE TABLE course (
course_id INT PRIMARY KEY,
course_name VARCHAR(255) NOT NULL,
teacher_name VARCHAR(255),
CONSTRAINT fk_course_teacher FOREIGN KEY (teacher_name) REFERENCES teacher (teacher_name)
);
--插入数据
INSERT INTO course (course_id, course_name, teacher_name) VALUES (101, 'Math', 'He');
INSERT INTO course (course_id, course_name, teacher_name) VALUES (102, 'English', 'Wang');
INSERT INTO course (course_id, course_name, teacher_name) VALUES (103, 'Chinese', 'Zhang');
-- 插入一条无效的记录,即该teacher_name在teacher表中不存在,返回错误
INSERT INTO course (course_id, course_name, teacher_name) VALUES (104, 'Art', 'Zhao');
Error: [E13005] 违反外键约束