MySQL数据库 外键 foreign key
1.多表关联
表之间的关系
一对多/多对多/一对一
什么时候要分表?
数据重复/结构混乱/扩展维护性差
2.外键 约束
create table 表名(字段名 类型(长度),foreign key(外键的字段名称) refernces 对方表名(对方主键名));
多对一 举例:部门和员工,部门可有多个员工,员工只能在一个部门
多对多 举例 一个老师可以教多个学生 一个学生可以被多个老师教,但需要一个中间表,专门储存关联关系
create table teacher(id int primary key auto_increment,name char(15)); create table student(id int primary key auto_increment,name char(15)); #中间表 create table tsr( id int primary key auto_increment, t_id int,s_id int, foreign key(t_id) references teacher(id), foreign key(s_id) references student(id) );
一对一 举例:1.假设学生是由客户转化的,一客户只能产生一个学生,一个学生只能对应一个客户,这样的关系是一对一。使用外键来关联,但是需要给外键加上唯一约束. 2.当一个表字段太多,而常用的字段不多时,可采取垂直分表的方式来提高效率 也有另外一种提升效率的方式,水平分表,表中记录数据太多,效率会降低,可以采取水平分表,字段完全相同。
create table customer(c_id int primary key auto_increment, name char(20),phonenum char(11),addr char(20)); create table student1(s_id int primary key auto_increment, name char(20), class char(11), number char(20), housenum char(20),c_id int UNIQUE, foreign key(c_id) references customer(c_id) );
使用外键时 必须分清主从关系
**外键的第一种约**:束先建主表 再建从表
**外键的第二个约束**:先插入主表 再插入从表
**外键的第三个约束**:删除记录时 先删除从表记录 再删主表记录
**外键的第四个约束**:从表更新外键时 必须保证外键是存在的
**外键的第五个约束**:更新主表的id时 必须先删除从表关联的数据 或者把关联数据 关联其他的主表id
**外键的第六个约束**:删除主表时 要先删除从表
有了这几个约束后,主表和从表中的数据必然是完整的
3.级联 cascade
很多情况下,我们就是要删除主表,然而这样需要至少两条sql语句,操作麻烦,这时可以使用级联
create table 表名(字段名 类型(长度),foreign key(外键的字段名称) refernces 对方表名(对方主键名)on delete cascade);
create table 表名(字段名 类型(长度),foreign key(外键的字段名称) refernces 对方表名(对方主键名)on update cascade);
on delete cascade 当主表删除记录时 从表相关联的记录同步删除
on update cascade 当主表id更新时 从表相关联的记录同步更新
注意这是单向的 主表变化时 级联操作从表 从表的变化不会级联到主表