My Blog

Primary_key

MySQL 的各种键属性

学习笔记,仅供参考

参考B站Mirco_Frank - MySQL 删库跑路


思维导图

mind_map


🎑 主键

在现实生活中,想要查找一个人的信息,可以通过身份证号码到相关的部门机构查询。因为身份证对于每个公民都是独一无二的,所以就可以通过这种唯一的标志来查询搜索。

而在数据库中像省份证这种具有唯一标识的字段就称为 主键(primary key)。在之前创建表时就已经使用了主键:

id int auto_increment primary key comment '主键id'   // 通过 primary key 关键字使 id 称为该表的主键

要是在建表时忘记添加主键了,还可以后期添加主键:

alter table <tab_name> add primary key (field_name);   // 后期添加主键

alter table <tab_name> drop primary key;   // 删除主键

作用 :

  1. 唯一标识数据 (如身份证),非空的、唯一的、每人都具有的(术语叫:完整性)

  2. 便于查询,关联其他表。无论在哪张表中,都可以通过主键找到


🧧 唯一键(unique)

唯一键表明其修饰的字段的数据不能有重复的,但可以为 NULL。但与主键不同的是,它能修饰多个字段,也不一定与其他表关联,而主键应该修饰一个字段就好。

name varchar(20) unique comment '姓名'   // 在创建表示添加唯一键

alter table <tab_name> add unique (field_name);   // 后期添加唯一键

alter table <tab_name> drop index <field_name>;   // 删除唯一键


🎀 外键(foreign key)

外键能将某表中的字段与其他表的字段关联起来,以此将两张表联系起来,建立其表与表之间的关系。

像学校的学生表与食堂的订单之间就可以通过外键联系起来。

外键示例

相关命令如下:

设置外键:

> create table eatery (
> id int primary key,
> money decimal(10,4),
> stuid int,
> foreign key (stuid) references stu(stuid)
> ); 

// 第一个(stuid)是食堂表的 stuid 字段被设置为外键
// 第二个(stuid)是外键来自于 stu 学生表中的 stuid 字段

show create table <tab_name>;   // 查看某表中的外键以及它的别名

alter table <tab_name> drop foreign key <alias>;   // 通过外键的别名删除外键

当然,关联起两个在操作时就会有一些联动、关联。通常有置空级联

  • 置空:当主表(学生表)的某条数据被删除,从表(食堂订单表)的外键被设置为 NULL

  • 级联:当主表(学生表)的某条数据被更新时,从表(食堂订单表)的外键也跟着被更新

外键的置空和级联的设置如下:

foreign key (stuid) references stu(stuid) on delete set null on update cascade   // 删除时置空,更新时级联

!要设置为外键的字段不能为 not null ,否则不能添加主键约束

!添加的外键要与主表中的键,数据类型一致

!在高并发的情况下,绝对不允许使用外键。大数据加上频繁变动等于服务器卡死机

注意 :

  1. 外键不能有主表之外的数据,如 ‘stuid=4’

  2. 当更新、删除主表数据时,从表会根据设置而变动

  3. 若想销毁主从表,应先删除从表,然后再删除主表


设计表所要考虑的问题

  1. 保证表中有主键,而且选择尽量选择那些不经常改动的字段作为主键,一个就好

  2. 考虑字段的数据类型、可否为空、是否给约束或 default ,根据实际去决定

  3. 是否需要引入外键或者被引用


🎁 一些数据库术语

1. 基本概念

  • 关系型数据库的 ‘关系’ 是靠两表间的 公共字段 联系起来的,从而确定了 数据完整性

  • 数据冗余 比如高考的总分字段,明明可以通过各科的成绩相加得出,但为了让考生能够快速查询到总分,就添加了总分字段。其优点:提高查询能,缺点:数据过多

  • 数据完整性 指字段的数据类型是否正确,范围是否合理等因素

同一事物在不同场合的称呼不同。

一条数据 实体(OOP)
一个字段 属性(OOP)

实体与实体间的关系(两表间数据的关系)

四种关系

三种范式

  1. 确定字段的 原子性 (每个字段不能再被分割)

  2. 非主键字段必须依赖主键字段 (别瞎几把找事,如学生表中不能有 ‘财富’, ‘是否单身’等无关的字段)

  3. 消除传递依赖 (尽可能地消除数据冗余,重复字段,如高考总分不能消除,但大学考试就可以没有总分)

总结 : Database Design 最终还是要根据实际的项目来具体的设计。