码迷,mamicode.com
首页 > 数据库 > 详细

mysql 外键的使用

时间:2020-07-01 09:29:35      阅读:85      评论:0      收藏:0      [点我收藏+]

标签:rom   eve   常见   需要   处理   lazy   指点   语法   date   

            外键(foreign key)

概念

foreign key,外面的主键,其他表的主键!

如果一个实体A的某个字段,刚好指向或者引用另一个实体B的主键,那么实体A的这个字段就是叫作外键!

技术图片

 

 

作用

外键的意义就是用来约束关系内的实体!

思考:

为什么要有外键约束?

因为比较符合现实中正常的业务逻辑!

假如上面的学生表中的班级字段出现了一个11班,就不符合逻辑,因为班级表中根本就没11班!

技术图片

 

 

 所以,外键的约束主要体现在以下的两个方面:

1, 增加子表记录的时候,是否有与之对应的父表记录!

2, 当删除或更改主表记录的时候,从表应该如何处理相关的记录!

定义

语法形式: foreign key(子表的字段名)    references 父表(父表的主键) 

 

 

 

技术图片

 

 

 

 

 -- -------------------外键(建表后再添加)--------------------------------------------------------------------

create table student(       -- |

stu_id tinyint unsigned auto_increment primary key,               -- |

stu_name varchar(10) not null default ‘‘,             -- |

stu_tea_id tinyint unsigned      -- |

)engine=innodb default charset=utf8;        -- |

        -- |

create table teacher(        -- |

tea_id tinyint unsigned auto_increment primary key,        -- |

tea_name varchar(10) not null        -- |

)engine=innodb default charset=utf8;        -- |

alter table student add foreign key(stu_tea_id) references teacher(tea_id);                  -- |

-- -----------------------------------------------------------------------------------------------------------------

 

 

-- -------------------外键(建表时添加)--------------------------------------------------------------------------------

#这种方式必须先添加父表再添加子表                          -- |

#父表                                 -- |

create table teacher(          -- |

tea_id tinyint unsigned auto_increment primary key,                  -- |

tea_name varchar(10) not null          -- |

)engine=innodb default charset=utf8;                  -- |

#子表  -- |

create table student(          -- |

stu_id tinyint unsigned auto_increment primary key,                  -- |

stu_name varchar(10) not null default ‘‘,                          -- |

stu_tea_id tinyint unsigned,               -- |

foreign key(stu_tea_id) references teacher(tea_id)       -- |

)engine=innodb default charset=utf8;               -- |

-- --------------------------------------------------------------------------------------------------------------------------

思考:

此时应该先插入父表的数据还是子表的数据?

 

应该先插入父表的数据!

添加数据

技术图片

以上,只是外键约束的一个方面:就是增加子表记录的时候,是否有与之对应的父表记录!

还有一个方面:就是当删除或更改主表记录的时候,从表应该如何处理相关的记录!

此时,我们就需要设置相关的级联操作!

设置级联

 所谓的级联操作,就是在操作一张表的时候,会影响到另一张表,也叫作关联操作或关联动作!

一般分成以下的两个操作:

主表更新

语法形式为:on update[级联操作]

主表删除

语法形式为:on delete[级联操作]

我们应该在定义一个外键的时候顺便设置级联操作!所以同样应该在子表上进行设置!

这里的级联操作常见的有三种形式:

cascade同步操作,也就是当主表的主键字段更新或删除的时候,从表的外键字段也进行相应的更新或删除

set null设置为null,也就是当主表的主键字段更新或删除的时候,从表的外键字段就设置为null,当前,有一个前提是从表的外键没有非空约束!

restrict就是拒绝主表更新或删除!

 

由于刚才定义外键的时候没有设置级联操作,我们可以先将这个外键删除,然后再增加一个外键

删除外键

alter  table  表名  drop  foreign key 外键名;

注意:

这里的外键名不是子表的字段名,而是在定义外键的时候由系统自动设定的,我们可以通过数据表的创建语句来查看:‘

show create table student\G

技术图片

 

alter table student drop foreign key student_ibfk_1;

 技术图片

 

重新添加外键且设置级联操作

alter  table  表名 add foreign key (子表的字段名) references 父表名(父表的主键) 级联操作

这里的级联操作可以有两个:

on update cascade|set null|restrict

on delete cascade|set null|restrict

#当主表更新的时候子表同步更新,当主表删除的时候就设置为null

alter table student add foreign key(stu_tea_id) references teacher(tea_id) on update cascade on delete set null;

 

 ------- ----------------------------------------------------完结,不足之处请指点啦 ---------------------------------------------------

 

 

foreign 

mysql 外键的使用

标签:rom   eve   常见   需要   处理   lazy   指点   语法   date   

原文地址:https://www.cnblogs.com/zhang19950924/p/13217202.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!