外键
一、外键的介绍
1、外键的定义:
让一张表记录的数据不要太过于冗余,在数据库中对表的关系进行解耦,尽量让表的数据单一化。
2、外键作用
外键的作用:保持数据的一致性和完整性
3、mysql 数据库中存储引擎?
innodb  (外键要使用innodb存储引擎)
myisam(默认)
4、查看存储引擎
格式:show  table  status  from   库名  where name="表名"  ;
案例:show  table  status  from   hz10  where name="emp"  ;
 
 
===============================
建表语句:
(1)通过建表语句来创建主键
mm  表
nn  表
mm表如下创建:
create  table  mm  (id  int(10) primary  key  , name varchar(10))ENGINE=innodb ;  (父表)
nn表 如下创建:
create  table  nn (sid  int(10) PRIMARY key ,sname  varchar(20)  , constraint  fk_wj  foreign  key(sid)  REFERENCES   mm(id) )engine=innodb ; (子表)
 constraint   外键名      指定外键
 foreign  key (子表)指定字段
 REFERENCES  父表(父表字段) 引用外部表的主键
(2)直接创建键(表先建好)
创建  ss 表: (父表)
create  table ss (id  int(10) primary  key  , name varchar(10))ENGINE=innodb;
创建  cc 表:(子表)
create  table  cc  (sid  int(10) primary  key  , sname varchar(10))ENGINE=innodb
格式:alter  table 子表 add  CONSTRAINT  外键名  foreign  key (子表字段名) REFERENCES   父表(父表的字段名)
案例:alter  table cc add  CONSTRAINT  ss_key  foreign  key (sid) REFERENCES ss(id)
 
===============================
查看外键:
方法一:
 
 
 
 
方法二:
格式:show  create  table    表名 ;
show  create  table  cc ;、
 
===============================
删除外键:
格式:alter  table  表名  drop   foreign  key     外键名   
案例:alter  table  cc drop  foreign key  ss_key ;
===============================
一、子表和父表之间关系:
1、在子表插入数据,父表不存在的数据无法插入(报错)
案例:INSERT  into  cc VALUES (1,"aa")   
报错(父表不存在的数据,子表无法插入)
Cannot add or update a child row: a foreign key constraint fails (`hz10`.`cc`, CONSTRAINT `ss_key` FOREIGN KEY (`sid`) REFERENCES `ss` (`id`))
2、在子表插入数据,父表存在的数据才能插入
案例  :
INSERT  into  ss VALUES (1,"wq") ;  先插入父表
INSERT  into  cc VALUES (1,"aa")             
 
 
 
3、父表和子表都为空数据,子表无法插入数据,父表可以插入数据
 
4、存在外键时:父表删除数据,需要先删除子表数据
4.1子表和父表数据都存在,直接删除父表,报错,无法删除
案例:DELETE   from  ss where id=1 ;  直接删除父表
Cannot delete or update a parent row: a foreign key constraint fails (`hz10`.`cc`, CONSTRAINT `ss_key` FOREIGN KEY (`sid`) REFERENCES `ss` (`id`))
4.1子表和父表数据都存在,直接先删除子表 ,在删除父表
DELETE   from  cc where sid=1 ;  先删除子表数据DELETE   from  ss where id=1 ;  在删除父表数据
 
4、主键名可以修改
alter  table cc add  CONSTRAINT  ss  foreign  key (sid) REFERENCES ss(id)
 
 
===============================
总结:
1、如何创建外键?
两种方法:1、建表时创建   父表     在子表设置外键
格式:create  table  表名(sid  int(10) PRIMARY key ,sname  varchar(20)  , constraint  fk_wj  foreign  key(sid)  REFERENCES   mm(id) )engine=innodb ; (子表)
2、建表后创建   
格式:alter  table  子表表名  add  CONSTRAINT  外键名  foreign  key (子表字段)    REFERENCES   父表(父表字段) engine=innodb ;
2、父表和子表的关系?
(1)当父表不存在的数据,子表无法插入
(2)当两表为空时,子表无法插入数据,父表可插入
(3)当父表删除数据,需要先删除子表数据
3、公司为什么用外键?
(1)保存数据的一致性和完整性
(2)公司数据量大,造成数据重复,新旧表维护成本大,使用外键让公司数据进行分类 和管理,让基础数据放在主表上,子表单一化,这样避免数据的冗余。