数据库的外键:主表与从表

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:
最近在学习数据库,涉及到主表与从表的时候很懵逼,有点无法理顺,看了一些视频和博客结合自己的理解,写了这篇博客,以此记录。如果有错的地方,可以留言纠正,感谢。


Mysql的外键是什么,有何用?

定义:如果一个A表的字段指向B表的主键,则此字段就位A表的外键。用于表示表之间的关系。存在外键的表,称之为从表,外键指向的表,称之为主表。
作用:保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。 使两张表形成关联,外键只能引用外表中的列的值或使用空值。
刚看有点抽象但结合例子就很好理解了。

编程的角度考虑,无外乎是为了让数据更加简洁明了,方便查找与使用管理。
先看看一张学生的综合数据表(表1):
在这里插入图片描述
很全面,既包含学生的个人信息,也包好学生的成绩。但如果增加了奖学金信息,学生的疫苗接种情况,这种表使用和查找起来还方便吗?
为此,我们将上述表进行拆分,得到如下表
学生信息表
在这里插入图片描述
分数表
在这里插入图片描述
通过学生表(主表),可以将学生的各类信息表(从表)链接起来,这样就能很好的实现表的数据一致性和完整性。通过字段id实现了两个表的关联。其中id就是分数表(从表)的外键。

外键的由来:
假设不构建外键,在我们的观点中,上述两个表是通过id联系在一起的,但计算机无法是别。为了能够使计算机识别,我们提出了外键的概念,这样就能更好的理解外键了吧。
这时候我们在来对外键使用特征进行小总结:
1、以公共关键字作主键的表为主键表(公共关键字也可以作为从表的主键)
2、以公共关键字作外键的表为外键表

注意事项:
1.从表的字段必须与外键类型同样(公共关键字,如上id)
2. 外键必须是主表的唯一键(学生表 id 是主键,而主键是唯一的。所以能够作为分数表 的外键)
3. 避免使用复合键(也就是说从表能够同一时候引用多个外表的字段作为一个外键,一般不推荐这样的做法)
这里的关联部分结合代码会更好理解。

以下操作皆是物理外键,数据库级别的外键,不建议使用–删除必须先删除从表,刚接触写了代码加深了解,这类代码以后基本用不到。

最佳实践:
1.数据库就是单纯的表,只用来存数据,只有行(数据)与列(字段)
2. 使用多张表的数据,需要外键(程序去实现)

代码演示

代码如下(示例):
综合表的创建

综合数据表
CREATE TABLE `student1` (
  `id` int(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
  `name` varchar(10) NOT NULL DEFAULT '匿名' COMMENT '姓名',
  `sex` varchar(2) NOT NULL DEFAULT '男' COMMENT '性别',
  `birthday` datetime DEFAULT NULL COMMENT '出生日期',
  `nation` varchar(50) DEFAULT '汉' COMMENT '民族',
  `address` varchar(100) DEFAULT NULL COMMENT '家庭住址',
  `语文` int(3) NOT NULL DEFAULT '0' COMMENT '语文分数',
  `数学` int(3) NOT NULL DEFAULT '0' COMMENT '数学分数',
  `英语` int(3) NOT NULL DEFAULT '0' COMMENT '英语分数',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

为了保持数据的一致性与完整性,我们将表分为两个:

学生信息表
CREATE TABLE `student` (
  `id` int(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
  `name` varchar(10) NOT NULL DEFAULT '匿名' COMMENT '姓名',
  `sex` varchar(2) NOT NULL DEFAULT '男' COMMENT '性别',
  `birthday` datetime DEFAULT NULL COMMENT '出生日期',
  `nation` varchar(50) DEFAULT '汉' COMMENT '民族',
  `address` varchar(100) DEFAULT NULL COMMENT '家庭住址',
   PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8

分数表

CREATE TABLE IF NOT EXISTS score(
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
`语文` INT(3) NOT NULL DEFAULT '0' COMMENT '语文分数',
`数学` INT(3) NOT NULL DEFAULT '0' COMMENT '数学分数',
`英语` INT(3) NOT NULL DEFAULT '0' COMMENT '英语分数',
PRIMARY KEY(`id`),
KEY `FK_id` (`id`),
CONSTRAINT `FK_id` FOREIGN KEY (`id`) REFERENCES `student`(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8

从表关联主表代码

方式一:在从表中加外键
CREATE TABLE IF NOT EXISTS score(
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
`语文` INT(3) NOT NULL DEFAULT '0' COMMENT '语文分数',
`数学` INT(3) NOT NULL DEFAULT '0' COMMENT '数学分数',
`英语` INT(3) NOT NULL DEFAULT '0' COMMENT '英语分数',
PRIMARY KEY(`id`),
KEY `FK_id` (`id`),
CONSTRAINT `FK_id` FOREIGN KEY (`id`) REFERENCES `student`(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
方式二:单独建好主表和从表后,利用如下代码即可:
ALTER TABLE `score` ADD CONSTRAINT `FK_id` FOREIGN KEY(`id`) REFERENCES `student`(`id`);

该处使用的url网络请求的数据。


总结

提示:这里对文章进行总结:
理解之后并不难,希望大家多多交流,如果有错误请指出。

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值