MySQL_属性、记录长度、设计范式、表关系
发布日期:2021-05-07 06:22:45 浏览次数:14 分类:技术文章

本文共 5128 字,大约阅读时间需要 17 分钟。

属性

属性作用

属性:建立在字段类型之后,对字段除类型之外的其他约束
属性是在定义表字段的时候针对每个字段进行属性设定
设定好的属性可以通过查看表字段desc进行查看
数据在进行增删改时需要在满足字段的要求同时还要满足属性的要求

一、NULL属性

NULL:数据是否允许为空
默认情况下数据允许为空
不为空设计:Not Null(不区分大小写)

示例1、用户信息表:用户名、密码、姓名、年龄create table t_23(	username varchar(50) not null,	password char(32) not null,	name varchar(20),	age tinyint unsigned,)charset utf8;

二、Default属性

默认值:default,在设计表字段的时候给定默认数据,在后续字段操作(数据新增)的时候系统没有检测到字段有数据的时候自动使用的值
默认值在字段设计的时候使用
默认值触发
      在系统进行数据插入时自动检测触发
      主动使用default关键字

示例1、用户开户create table t_24(	account varchar(19) not null,	id_card char(18) not null,	money decimal(16, 2) default 0.00 not null)charset utf8;2、默认值触发默认触发insert into t_24 (account, id_card) values('62260000000001','400000000000');主动触发insert into t_24 vvalues('62260000000001','400000000000', default);

三、主键

primary key, 用来保证整张表中对应的字段永远不会出现重复数据
主键在一张表中只能有一个
主键的另外一个特性是能够提升主键字段作为查询条件的效率
主键不能为空:not null(默认)
逻辑主键:数据没有具体业务意义,纯粹是一种数值数据
      逻辑主键通常是整数:int
      逻辑主键的目的是方便检索和数据安全(不暴露数据的真实信息)
复合主键:多个字段共同组成不能重复的数据
      primary key(字段1,字段2…)
      复合主键使用不多,一般不会超过2个字段

示例:银行账户信息create table t_25(	account varchar(17) primary key,	name varchar(20) not null)charset utf8;复合主键create table t_27(	account varchar(17),	name varchar(20),	money decimal(16,2) not null default 0.00,	primary key(account,name))charset utf8;逻辑主键create table t_27(	id int unsigned primary key,	account varchar(17) not null,	name varchar(20) not null,	money decimal(16,2) not null default 0.00)charset utf8;

主键管理

删除主键:主键只有一个alter table t_26 drop primary key;后期新增主键alter table t_26 add primary key(account,name);

四、自增长属性

auto_increment,被修饰的字段在新增时,自动增长数据
自增长只能是整数类型,而且对应的字段必须是一个索引(通常逻辑主键)
一张表只能有一个自动增长
自增长数据可以理解为一种默认值,如果主动给值,不会触发自动增长
自增长由两个变量控制
      初始值:auto_increment_offset,默认是1
      步长:auto_increment_increment, 默认值是1
      查案自增长控制:show variables like ‘auto_increment%’;

示例1、记录学生信息create table t_28(	id int primary key auto_increment,	stu_no int(8) zerofill not null,	stu_name varchar(20) not null)charset utf8;2、触发自增长使用自增长(可以使用null或者default来触发)insert into t_28 values(null,1,'Lily');insert into t_28 values(default,2,'Lily');主动控制:自增长的值会从当前最大的值开始自动增长insert into t_28 values(10,3,'Lily');insert into t_28 values(null,4,'Lucy');

自增长管理:在某些特殊使用下,需要自增长按照需求实现

修改表中自增长的值:让下次自增长按照指定值开始
修改自增长控制:调整自增长的变化

示例1、修改表中自增长的值,跳过一些值,直接从下次开始按照新的目标值出现alter table t_28 auto_increment=20;注意:奇数会保留原值,偶数会自动加12、修改自增长控制:步长和起始值(修改针对的是整个数据库,而非单张表)set auto_increment_increment=2;当前用户当前连接有效(局部)set @@auto_increment_increment=2;所有用户一直有效(全局)

五、唯一键属性

unique key,用来维护数据的唯一性
一个表中可以有多个唯一键
唯一键与主键的区别在与唯一键允许数据为null
唯一键与主键一样的是可以提升字段数据当做条件查询的效率
复合唯一键:多个字段共同组成
      unique key(字段1,字段2…)
      一般不会出现,最多2个字段组成

示例用户表:用户名唯一,而且经常作为查询条件create talbe t_29(	id int primary key atuo_increment,	username varchar(50) unique comment '唯一键可以直接在字段后增加,使用unique关键字',	password char(32) not null)charset utf8;

唯一键管理:在表创建后对唯一键的管理

删除唯一键:一张表中不止一个唯一键,alter table 表名 drop index 唯一键名字;
新增唯一键:alter table 表名 add unique key(字段列表);

示例1、删除表中已有的唯一键alter table t_30 drop index stu_name;2、追加唯一键alter table t_30 add unique key stu_course (stu_name, course);

六、comment属性

comment,使用文字描述字段的作用
comment代表的内容是对字段的描述,类似注释
描述如果涉及到字符集一定要在创建表之前设置好客户端字符集(否则出现描述乱码)

数据库记录长度

数据库记录长度:mysql规定一条记录所占存储长度最长不超过65535字节

记录长度为表中所有字段预计占用长度之和
所有字段有允许为null的,系统就会预留一个字节存储null

示例1、gbk表能存储的最大varchar字符串长度create table t_32(	content varchar(32766))charset gbk;2、utf8表能存储的最大varchar字符串长度create talbe t_32(	content varchar(21))charset utf8;3、null也要占用一个字节create talbe t_34(	id tinyint not null,	content varchar(21844) not null)charset utf8;

关系型数据库设计范式

范式:normal format,符合某一种级别的关系模式的集合,表示一个关系内部各属性之间的联系的合理化程度

范式级别越高,表的级别就越标准
目前数据库应用到的范式有以下几层
      第一范式:1NF
      第二范式:2NF
      第三范式:3NF
      逆规范化

一、第一范式:数据字段设计时必须满足原子性

1NF要求字段数据是不需要拆分就可以直接应用

示例1、设计一张学生选修课成绩表学生		性别		课程		教室		成绩		学习时间张三		男			php     	101			100			2.1,2.28李四		女			java		102			90			3.1,3.31张三		男			java		102			95			3.1,3.31当前表的学习时间允许数据拆分,不满足原子性2、转换为满足1NF设计学生		性别		课程		教室		成绩		开始时间		结束时间	张三		男			php     	101			100			2.1			2.28李四		女			java		102			90			3.1			3.31张三		男			java		102			95			3.1			3.31

二、第二范式:字段设计不能存在部分依赖

部分依赖:首先表存在复合主键,其次有的字段不是依赖整个主键,而只是依赖主键中的一部分
部分依赖解决:让所有非主属性都依赖一个候选关键字
      最简单方式:取消复合主键
      正确方式:将部分依赖关系独立成表

示例1、学生成绩表中学生和课程应该是决定性关系,因此属于主属性(主键)学生		性别	课程	教室	成绩	开始时间	结束时间	张三		男		php     101		100		2.1		2.28李四		女		java	102		90		3.1		3.31张三		男		java	102		95		3.1		3.31成绩是由学生和课程决定的,是完全依赖主属性性别只依赖学生(部分依赖)教室、开始时间和结束时间依赖课程(部分依赖)2、解决方案:将学生信息维护到一张表,课程信息维护到一张表,成绩表取两个表主属性即可学生表stu_id		姓名		性别1			张三		男2			李四		女stu_id是姓名的代指属性(逻辑主键,本质主键是姓名)性别只依赖主属性课程表class_id	课程 	教室    开始时间    结束时间1			php		101		2.1			2.282			java	102		3.1			3.31class_id是课程的代指属性(逻辑主键)教室、开始时间和结束时间都依赖课程(主属性)成绩表stu_id    class_id    	成绩1			1			1002			2			901			2			95stu_id和class_id共同组成主属性(复合主键)成绩依赖stu_id和class_id本身,不存在部分依赖

三、第三范式:字段设计不能存在传递依赖

传递依赖:字段某个非主属性不直接依赖主属性,而是通过依赖某个其他的非主属性而传递到主属性之上
传递依赖解决:让依赖非主属性的字段与依赖字段独立成表

四、逆规范化:提升数据查询效率而可以违背规范的规则

逆规范化就是减少表之间的关联查询,可以增加数据冗余
通常用于某个表被高频次查询

表关系

表关系:一个表代表一个实体,实体之间都有关联关系

根据范式的要求来设计表关系,减少数据冗余
根据实际需求来设计表关系,提升访问效率

一、一对一关系:一张表中的一条记录与另外一张表中有且仅有一条记录有关系

一对一关系通常是用来将一张原本是一体的表拆分成两张表
频繁使用部分:常见字段
不常用部分:生僻字段
使用相同的主键对应
一对一关系设计较多使用在优化方面

二、一对多关系:也叫多对一关系,一张表中的一条记录与另一张表的多条记录对应,反过来另外一张表的多条记录只能对应当前表的一条记录

一对多关系的核心在于分析出表与表之间的关系

三、多对多关系:一张表中的一条记录对应另外一个表中多条记录,反过来一样

多对多关系是无法在自身表中维护对应表关系,需要通过第三方表来实现将多对多关系变成多个多对一关系
设计一个中间表:记录两张表之间的对应关系
中间表与其他表都是多对一关系

上一篇:MySQL_mysql高级操作、多表操作
下一篇:MySQL_字符集、校对集、字段类型

发表评论

最新留言

关注你微信了!
[***.104.42.241]2025年03月20日 17时48分40秒