数据库外键基础知识和操作(世界杯版)

本文通过足球明星的例子,详细解释了数据库中外键的概念及其作用。包括外键如何保证数据的完整性和一致性,以及如何进行外键的创建、查询和删除等操作。

在数据库的操作中,外建是很常见的操作。近期花了一些时间学习外键,整理学习笔记。

外键说明



以一个例子来说明外键。正值俄罗斯世界杯期间,

32支国家队比赛精彩异常,其中巨星球星毫无疑问:C罗、梅西、内马尔。这里有两张表:

表A,其中姓名是主键。



主键:为了保证数据的完整性和唯一性,每一个表能够唯一代表该表的字段,不会出现重复。例如身份证ID号。表中运动员姓名也基本上没有重名,在表A中能够作为唯一标示。

表B:其中球队排名是主键,当家球员是外键,关联的是表A的姓名。这是我们把表A称之为主表,表B称之为从表。




创建表

首先创建Country表,设置ranking为主键 

然后创建Playeers,设置c_id为外键。关联到表Country的rangking字段。其中外键设置的语句是

foreign key(c_id) references Country(ranking)




插入数据

Country插入数据

Playeers插入数据

 


单表查询

查询出表Country中所有的字段

查询出表Playeers中所有的字段

 

连表查询

看到上面两张表,有没有人感兴趣运动员收入和国家排名有没有关系呢?国家排名在表Country中,薪水在表Playeers中。如果查询两张表呢?答案是使用外键所关联的字段查询。

查询表Country中的ranking字段,name字段和Playeers中的solary,通过Playeers中的c_id字段和Country中的ranking字段关联两张表。因为c_id和ranking是一一对应的关系,所以能够很好查询。这里要重点说明,连表查询不是外键特有的,两张表只要有相同的字段都可以连表查询,而外键因为是一一对应关系,所以很适合连表查询。

 

 

实际上,外键的好处:"保证数据的完整体",现在两张表可以合成一张表。例如查询出全部的字段,可以看到ranking和c_id是一样的,通过这两个字段能够连接两张表。

 




外键特性

完整性

前面总结外键的优点有两个:保证数据的完整性和保证数据的一致性。完整性是如果体现的呢?比如说,我现在想在插入一个我喜欢的球员:苏神,苏亚雷斯。9号球衣,乌拉圭球员,排名22,年薪1200万欧元。


但这时插入失败,报错“不能增加到一个外键关联的表”。这是因为苏神的国家排名是22,而在表Country的ranking中并没有22这个值,所以Playeers也不能插入。外键保证数据的完整性就是在附表中插入数据时,外键所在的字段的值要检查主表中对应字段中是否有相同的值,如果有就能够插入,没有就不能插入。这里所说一句:如果插入苏神时排名去掉,是可以插入的,如果苏神是巴西人,c_id是2,也是能够插入的。这里体现的是外键取值准则:可以空值或者是重复,或者一定要是主键之中的值。

 一致性

说完了完整性,外键如何保证数据的一致性?例如我要删除表Country,结果报错:

报错:"不能够删除或者更新一个父列,有外键关关联"。因为如果删除了Country,Playeers表的外键关联就失去了,这样做外键是不允许的。以前面部门表和工资表为例,试想员工离职了,把其从部门表中删除,而工资表忘记删了,结果人不在工资照发,这个锅要谁来背?聪明的做法就是外键关联,这样删部门表时会提示还有外键关联的工资表,就不会人不在还发工资了。

 




删除外键连接 

删除有外键关联的表有两种方式:

  1. 先删除从表,即表Playeers,然后删除主表Country

  2. 先删除外键约束,再删除主表

以方法2删除外键约束为例:格式:alter table 表名 drop foreign key 外键_id;

外键ID查询方法:show create table Playeers



删除外键

没有外键约束之后就能正常删除表Country。


更多文章请关注订yue号:java_xuetang





更多文章请关注订yue号:java_xuetang更多文章请关注订yue号:java_xuetang

### 约束的定义 如果张表中的个字段指向了另张表中的主,就将该字段称为数据类型必须指向的主致,定义的表称为从表,被引用的表称为主表。约束用来在两个表的数据之间建立连接,可以指定个字段或者多个字段为,其作用是保护数据的引用完整性。个表的可以为空值,若不为空值,则必须是另个表中主的某个值 [^2][^3]。 ### 约束的创建 #### 创建表时定义约束 ```sql -- 主表 CREATE TABLE users ( id int unsigned primary key auto_increment, username varchar(20) not null ); -- 从表 CREATE TABLE dynamic_1 ( id int unsigned primary key auto_increment, content varchar(220) not null, user_id int unsigned, foreign key(user_id) references users(id) ); ``` #### 在已有表中添加约束 ```sql -- 为emp01表的dept_id字段添加约束,关联dept01表的主id alter table emp01 add constraint fk_emp01_dept01_id foreign key (dept_id) references dept01(id); ``` ### 约束的作用 约束主要用于维护数据库数据的引用完整性,确保从表中的值在主表的主中存在。例如,在学生选课系统中,选课表的课程编号作为引用课程表的课程编号,这样可以保证选课表中记录的课程都是课程表中存在的课程。 ### 约束在数据删除更新时的影响 在数据删除更新操作中,约束会对主表从表的数据产生定的限制。例如,当尝试删除主表中的条记录时,如果从表中存在引用该记录主记录,默认情况下删除操作会失败,以保证数据的引用完整性。不过可以通过设置不同的约束行为(如`CASCADE`、`SET NULL`等)来改变这种默认行为。 ### 约束的开启与关闭 在MySQL数据库中,约束可以根据实际需求开启或关闭。在日常维护或复杂的数据迁移项目中,合理地开启或关闭约束对于提升数据库操作的效率安全性至关重要 [^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值