何为外键?
如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为子表(从表)。【注:两个表必须是InnoDB表,MyISAM表暂时不支持外键】
外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以;
精辟:
当删除子表时,主表是不会受到影响的;而当删除主表时,子表可能会受到影响。
因为因为外键关联是设置在子表的,也就是说子表纯粹是一厢情愿的事,子表是死是活,跟主表一毛钱关系没有。
外键的作用:
外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是修改或者删除的级联操作将使得日常的维护工作更加轻松。
5种外键约束方式的区别
- cascade方式(级联方式)
在父表上update/delete记录时,同步update/delete掉子表的匹配记录
- set null方式
在父表上update/delete记录时,将子表上匹配记录的列设为null
注意:子表的外键列不能为not null
- no action方式
如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作(操作会失败,即不做任何操作)
- restrict方式
效果同no action,两者在mysql中,都是立即检查外键约束
- set default方式
父表有变更时,子表将外键列设置成一个默认的值 但Innodb目前不能识别
以下是代码示例:
部门表(主表)
create table if not exists department (
id int(11) primary key auto_increment,
name varchar(32) not null
);
用户表(子表 / 从表)
create table if not exists user (
id int(11) primary key auto_increment,
name varchar(32) not null,
did int(11),
--添加外键约束(将 主表department中的主键id 与 本表的字段did 关联起来, 本表字段did 将作为外键存在)
constraint fk_did foreign key(did) references department(id)
);
【 fk_did:是外键约束名称;did:是本表的外键字段; department(id):是关联的主表(主键)】
注:mysql中新建的外键约束默认的约束方式是 restrict
从以下的ER图表,可以看出两张表的联系
若在新建表的时候忘记添加外键约束,没有关系,可以在表已存在的情况下通过修改表来添加外键约束:
create table if not exists user1 (
id int(11) primary key auto_increment,
name varchar(32) not null,
did int(11)
);
--通过修改表来 添加外键约束
alter table user1 add constraint fk1_did foreign key(did) references department(id);
【 fk_did:是外键约束名称;did:是本表的外键字段; department(id):是关联的主表(主键)】
当然,对于已存在外键约束的表,也可通过修改表来删除外键约束:
alter table user1 drop foreign key fk1_did;
【fk1_did:外键约束名称】
在添加外键约束的时候,其实也可以指定约束方式:
alter table user1 add constraint fk1_did foreign key(did) references department(id)
on delete cascade on update set null;
不同外键约束方式的效果体现,具体示例可参考下文: