数据库外键基础知识和操作(世界杯版)
2018-06-28 10:19
246 查看
在数据库的操作中,外建是很常见的操作。近期花了一些时间学习外键,整理学习笔记。
表A,其中姓名是主键。
![](https://images2018.cnblogs.com/blog/1060878/201806/1060878-20180625224534501-1944157360.png)
主键:为了保证数据的完整性和唯一性,每一个表能够唯一代表该表的字段,不会出现重复。例如身份证ID号。表中运动员姓名也基本上没有重名,在表A中能够作为唯一标示。
表B:其中球队排名是主键,当家球员是外键,关联的是表A的姓名。这是我们把表A称之为主表,表B称之为从表。
![](https://images2018.cnblogs.com/blog/1060878/201806/1060878-20180625230041547-747009897.png)
在如上两张表中,我们可以说:表B的外键是字段"当家球员",关联的字段是表A的姓名。姓名是表A的主键,外键的要求:一个表的外键关联另一个表的主键。如果插入韩国队,没有当家球员,外键的值为空,这么增加可以吗?是可以的,主键的值要求一定存在,并且是唯一的,而外键的要求是:可以是空值,也可以重复。
![](https://images2018.cnblogs.com/blog/1060878/201806/1060878-20180625231445219-29530312.png)
两张表目前的连接关系如下图:
![](https://images2018.cnblogs.com/blog/1060878/201806/1060878-20180627223854455-961668979.png)
简单总结外键的特点:
一张表的外键一定是关联到另一张表的主键
外键可以是空值和重复,主键不可为空值且一定是唯一
那么对于一张表来说,外键有什么好处呢。有一个很贴切生活的解释。一个人在公司中一张部门表A:
![](https://images2018.cnblogs.com/blog/1060878/201806/1060878-20180627190034953-1134785961.png)
另一张是工资表B:
![](https://images2018.cnblogs.com/blog/1060878/201806/1060878-20180627190243818-756463570.png)
表A中的工号ID 是主键,表B 中的姓名是外键。现在如果张三,工号1,因为世界杯看球被开出了,这是要从表A中将工号ID为1的员工删除,那么相应的表B中工资表也应该将其删除。假如操作人员忘记删除了工资表,人不在了工资照发,老板岂不是要吐血。如果没有外键关联需要人工手动删除,有外键关联能够通过外键的联系将其删除。这就是外键的好处之一。外键的好处有如下几个:
保证数据的完整性
保证数据的一致性
表Country:主键是世界排名,字段是国家名称
![](https://images2018.cnblogs.com/blog/1060878/201806/1060878-20180627192614750-684020396.png)
表Playeers:外键是国家排名
![](https://images2018.cnblogs.com/blog/1060878/201806/1060878-20180627193552683-1427746697.png)
创建表
首先创建Country表,设置ranking为主键
![](https://images2018.cnblogs.com/blog/1060878/201806/1060878-20180627192210497-1393622249.png)
然后创建Playeers,设置c_id为外键。关联到表Country的rangking字段。其中外键设置的语句是
foreign key(c_id) references Country(ranking)
![](https://images2018.cnblogs.com/blog/1060878/201806/1060878-20180627192236726-750566517.png)
插入数据
Country插入数据
![](https://images2018.cnblogs.com/blog/1060878/201806/1060878-20180627194828099-1431679275.png)
Playeers插入数据
![](https://images2018.cnblogs.com/blog/1060878/201806/1060878-20180627195155260-1913942474.png)
单表查询
查询出表Country中所有的字段
![](https://images2018.cnblogs.com/blog/1060878/201806/1060878-20180627195358541-500885883.png)
查询出表Playeers中所有的字段
![](https://images2018.cnblogs.com/blog/1060878/201806/1060878-20180627195436948-1337781027.png)
连表查询
看到上面两张表,有没有人感兴趣运动员收入和国家排名有没有关系呢?国家排名在表Country中,薪水在表Playeers中。如果查询两张表呢?答案是使用外键所关联的字段查询。
查询表Country中的ranking字段,name字段和Playeers中的solary,通过Playeers中的c_id字段和Country中的ranking字段关联两张表。因为c_id和ranking是一一对应的关系,所以能够很好查询。这里要重点说明,连表查询不是外键特有的,两张表只要有相同的字段都可以连表查询,而外键因为是一一对应关系,所以很适合连表查询。
![](https://images2018.cnblogs.com/blog/1060878/201806/1060878-20180627195957096-57665655.png)
实际上,外键的好处:"保证数据的完整体",现在两张表可以合成一张表。例如查询出全部的字段,可以看到ranking和c_id是一样的,通过这两个字段能够连接两张表。
![](https://images2018.cnblogs.com/blog/1060878/201806/1060878-20180627195840741-987964320.png)
![](https://images2018.cnblogs.com/blog/1060878/201806/1060878-20180628101310606-1783185231.png)
外键特性
完整性
前面总结外键的优点有两个:保证数据的完整性和保证数据的一致性。完整性是如果体现的呢?比如说,我现在想在插入一个我喜欢的球员:苏神,苏亚雷斯。9号球衣,乌拉圭球员,排名22,年薪1200万欧元。
![](https://images2018.cnblogs.com/blog/1060878/201806/1060878-20180627200304453-210103130.png)
但这时插入失败,报错“不能增加到一个外键关联的表”。这是因为苏神的国家排名是22,而在表Country的ranking中并没有22这个值,所以Playeers也不能插入。外键保证数据的完整性就是在附表中插入数据时,外键所在的字段的值要检查主表中对应字段中是否有相同的值,如果有就能够插入,没有就不能插入。这里所说一句:如果插入苏神时排名去掉,是可以插入的,如果苏神是巴西人,c_id是2,也是能够插入的。这里体现的是外键取值准则:可以空值或者是重复,或者一定要是主键之中的值。
一致性
说完了完整性,外键如何保证数据的一致性?例如我要删除表Country,结果报错:
![](https://images2018.cnblogs.com/blog/1060878/201806/1060878-20180627200546112-2064945511.png)
报错:"不能够删除或者更新一个父列,有外键关关联"。因为如果删除了Country,Playeers表的外键关联就失去了,这样做外键是不允许的。以前面部门表和工资表为例,试想员工离职了,把其从部门表中删除,而工资表忘记删了,结果人不在工资照发,这个锅要谁来背?聪明的做法就是外键关联,这样删部门表时会提示还有外键关联的工资表,就不会人不在还发工资了。
删除外键连接
删除有外键关联的表有两种方式:
先删除从表,即表Playeers,然后删除主表Country
先删除外键约束,再删除主表
以方法2删除外键约束为例:格式:alter table 表名 drop foreign key 外键_id;
外键ID查询方法:show create table Playeers
![](https://images2018.cnblogs.com/blog/1060878/201806/1060878-20180627201044148-1003102210.png)
删除外键
![](https://images2018.cnblogs.com/blog/1060878/201806/1060878-20180627201334129-844938379.png)
没有外键约束之后就能正常删除表Country。
![](https://images2018.cnblogs.com/blog/1060878/201806/1060878-20180627201405366-780244678.png)
后记:
刚写完博文,早上起床一看,德国0 :1不敌韩国,小组赛淘汰,一口老血喷出来,德国啊德国让我怎么说你好呢?
外键说明
以一个例子来说明外键。正值俄罗斯世界杯期间,32支国家队比赛精彩异常,其中巨星球星毫无疑问:C罗、梅西、内马尔。这里有两张表:表A,其中姓名是主键。
![](https://images2018.cnblogs.com/blog/1060878/201806/1060878-20180625224534501-1944157360.png)
主键:为了保证数据的完整性和唯一性,每一个表能够唯一代表该表的字段,不会出现重复。例如身份证ID号。表中运动员姓名也基本上没有重名,在表A中能够作为唯一标示。
表B:其中球队排名是主键,当家球员是外键,关联的是表A的姓名。这是我们把表A称之为主表,表B称之为从表。
![](https://images2018.cnblogs.com/blog/1060878/201806/1060878-20180625230041547-747009897.png)
在如上两张表中,我们可以说:表B的外键是字段"当家球员",关联的字段是表A的姓名。姓名是表A的主键,外键的要求:一个表的外键关联另一个表的主键。如果插入韩国队,没有当家球员,外键的值为空,这么增加可以吗?是可以的,主键的值要求一定存在,并且是唯一的,而外键的要求是:可以是空值,也可以重复。
![](https://images2018.cnblogs.com/blog/1060878/201806/1060878-20180625231445219-29530312.png)
两张表目前的连接关系如下图:
![](https://images2018.cnblogs.com/blog/1060878/201806/1060878-20180627223854455-961668979.png)
简单总结外键的特点:
一张表的外键一定是关联到另一张表的主键
外键可以是空值和重复,主键不可为空值且一定是唯一
那么对于一张表来说,外键有什么好处呢。有一个很贴切生活的解释。一个人在公司中一张部门表A:
![](https://images2018.cnblogs.com/blog/1060878/201806/1060878-20180627190034953-1134785961.png)
另一张是工资表B:
![](https://images2018.cnblogs.com/blog/1060878/201806/1060878-20180627190243818-756463570.png)
表A中的工号ID 是主键,表B 中的姓名是外键。现在如果张三,工号1,因为世界杯看球被开出了,这是要从表A中将工号ID为1的员工删除,那么相应的表B中工资表也应该将其删除。假如操作人员忘记删除了工资表,人不在了工资照发,老板岂不是要吐血。如果没有外键关联需要人工手动删除,有外键关联能够通过外键的联系将其删除。这就是外键的好处之一。外键的好处有如下几个:
保证数据的完整性
保证数据的一致性
数据库具体操作
创建两张表表Country:主键是世界排名,字段是国家名称
![](https://images2018.cnblogs.com/blog/1060878/201806/1060878-20180627192614750-684020396.png)
表Playeers:外键是国家排名
![](https://images2018.cnblogs.com/blog/1060878/201806/1060878-20180627193552683-1427746697.png)
创建表
首先创建Country表,设置ranking为主键
![](https://images2018.cnblogs.com/blog/1060878/201806/1060878-20180627192210497-1393622249.png)
然后创建Playeers,设置c_id为外键。关联到表Country的rangking字段。其中外键设置的语句是
foreign key(c_id) references Country(ranking)
![](https://images2018.cnblogs.com/blog/1060878/201806/1060878-20180627192236726-750566517.png)
插入数据
Country插入数据
![](https://images2018.cnblogs.com/blog/1060878/201806/1060878-20180627194828099-1431679275.png)
Playeers插入数据
![](https://images2018.cnblogs.com/blog/1060878/201806/1060878-20180627195155260-1913942474.png)
单表查询
查询出表Country中所有的字段
![](https://images2018.cnblogs.com/blog/1060878/201806/1060878-20180627195358541-500885883.png)
查询出表Playeers中所有的字段
![](https://images2018.cnblogs.com/blog/1060878/201806/1060878-20180627195436948-1337781027.png)
连表查询
看到上面两张表,有没有人感兴趣运动员收入和国家排名有没有关系呢?国家排名在表Country中,薪水在表Playeers中。如果查询两张表呢?答案是使用外键所关联的字段查询。
查询表Country中的ranking字段,name字段和Playeers中的solary,通过Playeers中的c_id字段和Country中的ranking字段关联两张表。因为c_id和ranking是一一对应的关系,所以能够很好查询。这里要重点说明,连表查询不是外键特有的,两张表只要有相同的字段都可以连表查询,而外键因为是一一对应关系,所以很适合连表查询。
![](https://images2018.cnblogs.com/blog/1060878/201806/1060878-20180627195957096-57665655.png)
实际上,外键的好处:"保证数据的完整体",现在两张表可以合成一张表。例如查询出全部的字段,可以看到ranking和c_id是一样的,通过这两个字段能够连接两张表。
![](https://images2018.cnblogs.com/blog/1060878/201806/1060878-20180627195840741-987964320.png)
![](https://images2018.cnblogs.com/blog/1060878/201806/1060878-20180628101310606-1783185231.png)
外键特性
完整性
前面总结外键的优点有两个:保证数据的完整性和保证数据的一致性。完整性是如果体现的呢?比如说,我现在想在插入一个我喜欢的球员:苏神,苏亚雷斯。9号球衣,乌拉圭球员,排名22,年薪1200万欧元。
![](https://images2018.cnblogs.com/blog/1060878/201806/1060878-20180627200304453-210103130.png)
但这时插入失败,报错“不能增加到一个外键关联的表”。这是因为苏神的国家排名是22,而在表Country的ranking中并没有22这个值,所以Playeers也不能插入。外键保证数据的完整性就是在附表中插入数据时,外键所在的字段的值要检查主表中对应字段中是否有相同的值,如果有就能够插入,没有就不能插入。这里所说一句:如果插入苏神时排名去掉,是可以插入的,如果苏神是巴西人,c_id是2,也是能够插入的。这里体现的是外键取值准则:可以空值或者是重复,或者一定要是主键之中的值。
一致性
说完了完整性,外键如何保证数据的一致性?例如我要删除表Country,结果报错:
![](https://images2018.cnblogs.com/blog/1060878/201806/1060878-20180627200546112-2064945511.png)
报错:"不能够删除或者更新一个父列,有外键关关联"。因为如果删除了Country,Playeers表的外键关联就失去了,这样做外键是不允许的。以前面部门表和工资表为例,试想员工离职了,把其从部门表中删除,而工资表忘记删了,结果人不在工资照发,这个锅要谁来背?聪明的做法就是外键关联,这样删部门表时会提示还有外键关联的工资表,就不会人不在还发工资了。
删除外键连接
删除有外键关联的表有两种方式:
先删除从表,即表Playeers,然后删除主表Country
先删除外键约束,再删除主表
以方法2删除外键约束为例:格式:alter table 表名 drop foreign key 外键_id;
外键ID查询方法:show create table Playeers
![](https://images2018.cnblogs.com/blog/1060878/201806/1060878-20180627201044148-1003102210.png)
删除外键
![](https://images2018.cnblogs.com/blog/1060878/201806/1060878-20180627201334129-844938379.png)
没有外键约束之后就能正常删除表Country。
![](https://images2018.cnblogs.com/blog/1060878/201806/1060878-20180627201405366-780244678.png)
后记:
刚写完博文,早上起床一看,德国0 :1不敌韩国,小组赛淘汰,一口老血喷出来,德国啊德国让我怎么说你好呢?
![](https://images2018.cnblogs.com/blog/1060878/201806/1060878-20180628100032143-868618696.jpg)
相关文章推荐
- Orcale数据库基础知识总结之orcale数据库的DDL和DML操作
- 数据库开发基本操作-数据库基础知识
- Java数据库连接——JDBC基础知识(操作数据库:增删改查)【转】
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.11Java数据库操作(4.11.1-4.11.8)
- 数据库开发基本操作-SQL Server数据库基础知识
- 数据库_基础知识_SQL中遍历一张表的每条记录并对每条记录执行相应操作的一种方法
- 3.22数据库基础知识:①数据类型②基本规则③数据库基本操作,增删改库,表
- 【PHP基础知识】——数据库MySQL操作(上)
- Postgresql 基础知识-1 数据库基础操作
- Spring MVC基础知识整理➣Spring+SpringMVC+Hibernate整合操作数据库
- C++数据库操作学习笔记:ADO基础知识
- 数据库基础知识、常用操作总结
- Java数据库连接--JDBC基础知识(操作数据库:增删改查)
- Java数据库连接——JDBC基础知识(操作数据库:增删改查)
- Java数据库连接——JDBC基础知识(操作数据库:增删改查)
- Java数据库连接--JDBC基础知识(操作数据库:增删改查)
- mysql基础知识之-数据库的创建、查看等常用操作
- 【PHP基础知识】——数据库MySQL操作(下)
- (转)Sybase ASE基础知识:利用Sybase Central简单操作Sybase ASE数据库
- Java软件开发基础知识梳理之(3)------JDCB操作数据库性能优化策略