MySQL外键的使用
概念通识:
关于MySQL的外键约束,总结起来就是使两个表或者一个表中的两个列有以从属关系为主的联系。
举例说明:
主表是老师,从表是学生。
为学生表建立外键约束:使得每个学生都对应一个老师,老师表不做任何改变(但在逻辑上一个老师可对应多个学生,实际上在数据库内部也对此一对多的关系做了处理,证明见后)
代码解释:
create table teachers(
teacher_id int auto_increment primary key,
teacher_name varchar(255) not null default ''
);
create table students(
student_id int auto_increment primary key,
student_name varchar(255) not null default '',
teacher_id int,
foreign key(teacher_id) references teachers(teacher_id)
);
这样就建立了学生表与老师表之间的从属联系。
需要注意的是:如果老师表中有一个老师和至少一个学生建立了从属关系,则要删除这个老师,必须先删除所有与他有联系的学生。代码测试说明如下:
insert into teachers values(null, 'Tom');
insert into students values(null, 'Sarah',1);
delete from teachers where teacher_id = 1;#error
上述代码的第五行是错误的:cannot delete or update a parent row: a foreign key constraint fails
即由于该老师仍然与某学生有从属关系,所以不能被删除,但如果给该行代码之前加上:
delete from students where teacher_id = 1;
则代码就会成功的运行。
补充:
个人认为外键还有一个很好用的用法:
可以在添加外键的时候加上约束:on delete cascade( 或者 on delete set null),则会在删除主表记录的时候删除所有与之相关的从表记录(或者将从表记录置为null)。
代码解释:
create table students_02(
student_id int auto_increment primary key,
student_name varchar(255) not null default '',
teacher_id int,
foreign key(teacher_id) references teachers(teacher_id) on delete cascade
);
insert into teachers values(null, 'Todd');
insert into students_02 values(null,'Amy',2);
insert into students_02 values(null,'Teddy',2);
select * from students_02;#有两条记录
delete from teachers where teacher_id = 2;
select * from students_02;#均被删除
可以看得出,所有插入students_02中的从属于teacher_id=2的记录均被删除。