外键(也叫外码或外部关键字)
外键介绍:
外键定义:用于建立和加强两个表数据之间的链接的一列或多列,通过将保存表中主键值的一列或多列添加到另一个表中,可创建两个表之间的链接,这个列就成为第二表的外键。外键所在的表也称为子表,所依赖的表称为父表。
语句: foreign key
1、让一张表记录的数据不要太过于冗余,在数据库中对标的关系进行解耦,尽量让标的数据单一化。
2、外键的作用:保持数据的一致性和完整性
3、msyql 数据库中的存储引擎
myisam (默认)
innodb (外键需要innodb存储格式)
4、查看存储引擎
格式:show table status from 库名 where name=“表名称”
案例:
show table status from dcs WHERE name=“sy2” ;
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/07117d9ec1acb9dab4c9c3b45eed1c10.png)
外键讲解:
一、第一种方式:先建两个表,在设置外键
1、先建两个表:创建engine=innodb 格式表
父表:create table f(id int(10) PRIMARY key , name char(20) ) engine=INNODB
子表:create table z(id int(10) PRIMARY key , name char(20) ) engine=INNODB
2、创建外键关键:
格式:alter table 子表 add CONSTRAINT 外键名 FOREIGN key (子表字段) REFERENCES 父表(父表字段) ;
案例:alter table z add CONSTRAINT fk FOREIGN key (sid) REFERENCES f(id) ;
二、第二种方式:先建一个表,在另一个表种设置外键
(1)新建一个表父表ff
create table ff(fid int(10) PRIMARY key , fname char(20) ) engine=INNODB
(2)新建第二个表 zz
create table zz(zid int(10) PRIMARY key , zname char(20) ,CONSTRAINT wj FOREIGN key(zid) REFERENCES ff(fid) ) engine=INNODB
(3)以上表示创建了关联关系
constraint 外键名 指定外键
foreign key (子表 字段) 指定子表字段
references 父表 (父表字段) 引用外部表的主键
==========================================
2、查看外键方法:
(1)通过语句:
格式:show create table 表名
案例:show create table z;
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/b48c19d5254131b3872f8112748f0e2f.png)
(2)在navicat下选择库,在点击表,设计及表,找到外键![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/59c4d2d00bd43b5d812bc5cf8cb08ee4.png)
删除外键
格式:alter table 表名 drop foreign key 外键名 ;
案例:alter table z drop foreign key fk ;
外键名:fk
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/46493c08a053e6879d13e2e36fae68ca.png)
外键的特点:
1、当父表不存在的数据,子表就无法插入数据(无法插入,报错)
子表直接插入数据,无法插入
create table zz(zid int(10) PRIMARY key , zname char(20) ,CONSTRAINT wj FOREIGN key(zid) REFERENCES ff(fid) ) engine=INNODB
insert into zz VALUES (1,“aa”);
报错: 外键约束了
Cannot add or update a child row: a foreign key constraint fails (dcs
.zz
, CONSTRAINT wj
FOREIGN KEY (zid
) REFERENCES ff
(fid
))
2、父表中存在的数据,子表才能出入数据
第一步:先插入父表数据,
insert into ff VALUES (1,“11”);
第二步:再插入子表数据
insert into zz VALUES (1,“aa”);
3、父表和子表都是空表,子表是无法插入数据
4、父表和子表 都存在,删除父表(无法删除)
案例:DELETE from ff where fid=1 ; (删除父表数据无法删除)
5、父表和子表 都存在 ,先删除子表数据,在删父表书数据
第一步:先删除子表 DELETE from zz where zid=1 ;
第二部:再删除父表 DELETE from ff where fid=1 ;
==============================================
面试题:
1、什么是外键?
2、如何创建外键?
3、子表和父表关系
4、公司中为什么用外键?
(1)保存数据的一致性和完整性
(2)公司数据量大,造成数据重复,新旧表维护成本大,使用外让公司数据进行分类和管理,让基础数据放在父表上,子表单一化,这样避免了数的冗余。
5、创建外键的数据库的格式是什么?