Primary_key
MySQL 的各种键属性
学习笔记,仅供参考
思维导图:
🎑 主键
在现实生活中,想要查找一个人的信息,可以通过身份证号码到相关的部门机构查询。因为身份证对于每个公民都是独一无二的,所以就可以通过这种唯一的标志来查询搜索。
而在数据库中像省份证这种具有唯一标识的字段就称为 主键(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;
// 删除主键
作用 :
唯一标识数据 (如身份证),非空的、唯一的、每人都具有的(术语叫:完整性)
便于查询,关联其他表。无论在哪张表中,都可以通过主键找到
🧧 唯一键(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
,否则不能添加主键约束
!添加的外键要与主表中的键,数据类型一致
!在高并发的情况下,绝对不允许使用外键。大数据加上频繁变动等于服务器卡死机
注意 :
外键不能有主表之外的数据,如 ‘stuid=4’
当更新、删除主表数据时,从表会根据设置而变动
若想销毁主从表,应先删除从表,然后再删除主表
设计表所要考虑的问题
保证表中有主键,而且选择尽量选择那些不经常改动的字段作为主键,一个就好
考虑字段的数据类型、可否为空、是否给约束或 default ,根据实际去决定
是否需要引入外键或者被引用
🎁 一些数据库术语
1. 基本概念
关系型数据库的 ‘关系’ 是靠两表间的
公共字段
联系起来的,从而确定了数据完整性
数据冗余
比如高考的总分字段,明明可以通过各科的成绩相加得出,但为了让考生能够快速查询到总分,就添加了总分字段。其优点:提高查询能,缺点:数据过多数据完整性
指字段的数据类型是否正确,范围是否合理等因素
同一事物在不同场合的称呼不同。
行 | 一条数据 | 实体(OOP) |
---|---|---|
列 | 一个字段 | 属性(OOP) |
实体与实体间的关系(两表间数据的关系)
三种范式
确定字段的
原子性
(每个字段不能再被分割)非主键字段必须依赖主键字段 (别瞎几把找事,如学生表中不能有 ‘财富’, ‘是否单身’等无关的字段)
消除传递依赖 (尽可能地消除数据冗余,重复字段,如高考总分不能消除,但大学考试就可以没有总分)
总结 : Database Design 最终还是要根据实际的项目来具体的设计。