Hexo

  • Home

  • About

  • Tags

  • Categories

  • Archives

  • Schedule

mysql15-表关系

Posted on 2019-02-03 | Edited on 2019-02-05 | In mysql

表关系

表关系:表与表之间(实体)有什么样的关系,每种关系应该如何设计表结构

一对一

一张表中的一条记录与另外一张表中最多有一条明确的关系,通常,此设计方案保证两张表中使用相同的主键即可
表的使用过程中:常用的信息会经常去查询,而不常用的信息会偶尔才会用到

解决方案:将两张表拆分,常见的放一张表,不常见的放一张表

一对多

一对多,通常也叫多对一的关系。通常一对多的关系设计的方案,在“多”关系的表中去维护一个字段,这个字段是“一”关系的主键

多对多

多对多:一张表中的一条记录在另外一张表中可以匹配到多条记录,反过来也一样

多对多的关系如果按照多对一的关系维护:就会出现一个字段中有多个其他表的主键,在访问的时候就会带来不便

既然通过两张表自己增加字段解决问题,那么就通过第三表来解决。

从中间设计一张表:维护两张表对应的联系,每一种联系都包含

例如:师生关系

  1. 一个老师教过多个班级的学生
  2. 一个学生听过多个老师讲的课


多对多解决方案:增加一个中间表,让中间表与对应的其他表形成两个多对一的关系:多对一的解决方案是在“多”表中增加“一”表对应的主键字段

mysql14-类属性之唯一键

Posted on 2019-02-02 | Edited on 2019-02-05 | In mysql

唯一键

唯一键:uniqe key:用来保证对应的字段中的数据唯一的。
主键也可以用来保证字段数据唯一性,但是一张表只有一个主键。唯一键在一张表中可以有多个。

  1. 唯一键在一张表中可以有多个
  2. 唯一键允许字段数据为null,null可以有多个(null不参与比较)

创建唯一键

创建唯一键与创建主键非常类似

  1. 直接在表字段之后增加唯一键标识符:unique【key】
  2. 在所以的字段之后使用unique key(字段列表);
  3. 在创建完表之后,也可以增加唯一键

查看唯一键

唯一键时属性,可以查看表结构来实现

唯一键效果:在不为空的情况下,不允许重复

//id字段 触发自增长为1,2,3



在查看表创建语句的时候会看到与主键不同的一点:会多出一个“名字”

删除唯一键

一个表中允许存在多个唯一键,假设命令为主键一样:alter table 表名 drop unique key此时系统不知道删除哪一个唯一键,出错

index关键字:索引,唯一键是索引的一种(提升查询效率)

删除的基本语法:alter table 表名 drop index 唯一键名字

//修改唯一键:删除后增加

复合唯一键

唯一键与主键一样可以使用多个字段来共同保证唯一性:
一般主键都是单一字段(逻辑字段),而其他需要唯一性的内容都是由唯一键来处理

mysql13-类属性之自增长

Posted on 2019-02-02 | Edited on 2019-02-25 | In mysql

列属性 自动增加

自动增加:auto_increment,当给定某个字段该属性之后,该列的数据在没有提供确定数据的时候,系统会根据之前已经存在的数据进行自动增加后,填充数据

通常自动增长用于逻辑主键

原理

自动增长的原理
1.系统中有维护一组数据用来保存当前使用了自动增长属性的字段,记住当前对应的数据值,再给定一个指定的步长
2当用户进行数据插入的时候,如果没有给定值,系统在原始值上再加上步长,所以就变成新的数据
3.自动增长的触发:给定属性的字段没有提供值
4.字段增长只适用于数值

使用自动增长

基本语法:在字段之后增加一个属性auto_increment



插入数据:触发自动增长,不能给定具体值

修改自动增长

1.查看自增长(可以使用显示表创建语句),自增加一旦触发使用之后,会自动的在表选项中增加一个选项(一张表最多只能拥有一个自动增长)

2.表选项可以通过修改表结构来实现

删除自动增长

删除自增长,就是在字段属性之后不再保留auto_increment,当用户修改自增长所在字段时,如果没有看到auto_increment属性,系统会自动清除该自增长

初始设置

在系统中,有一组变量用来维护自增长的初始值和步长
查看自增长初始变量 show variables like ‘auto_increment%’

细节问题

  1. 一张表只有一个自增长,自增长会上升到表选项中
  2. 如果数据插入中没有触发自增长(给定了数据),那么自增长不会表现
  3. 自增长在修改的时候,值可以较大,但是不能比当前已有的自增长字段小

怎么重置mysql的自增列

  1. 支持设置自增列的值

ALTER TABLE table_name AUTO_INCREMENT = 1;
不过这种方式自能设置大于当前使用的值,不能设置小于等于当前已经使用的自增列的值。myisam如果设置小于等于,则自增列的值会自动设置为
当前最大值加1。innodb则不会改变。

2.通过TRUNCATE把自增列设置为0,从MySQL 5.0.13开始TRUNCATE就能重置自增列为0.myisam和innode都是如此。

TRUNCATE TABLE table_name;
3.drop和create重建表方式重置自增列为0

DROP TABLE table_name;
CREATE TABLE table_name { … };

mysql12-类属性之主键

Posted on 2019-02-02 | In mysql

列属性主键

顾名思义:主要的键,primary key,在一张表中,有且只有一个字段,里面的值具有唯一性

创建主键

###随表创建
系统提供了两种增加主键的方式:

  1. 方案1:直接在需要当作主键的字段之后,增加primary key属性来确定主键
  2. 方案2:在所有字段之后增加primary key选项:primary key(字段信息)

    表后增加

    基本语法:alter table 表名 add primary key(字段)

查看主键

方案1:查看表结构

方案2:查看表的创建语句

删除主键

基本语法:alter table 表名 drop primary key

复合主键

案例:有一张学生选修课表,一个学生可以选修多个选修课,一个选修课也可以由多个学生来选,但是一个学生在一个选修课中只有一个成绩

主键约束

主键一旦增加,那么对对应的字段由数据要求

  1. 当前字段对对应的数据不能为空
  2. 当前字段对应的数据不能由任何重复

主键分类

主键分类采用的是主键所对应的字段的业务意义分类
业务主键:主键所在的字段,具有业务意义(学生ID,课程ID
逻辑主键:自然增加的整型(应用广泛,唯一性)

mysql11-类属性之简单属性

Posted on 2019-02-02 | In mysql

列属性

列属性又称之为字段属性:在mysql中一共有6个属性,null,默认值,列描述,主键,唯一值和自动增长

null属性

null属性:代表字段位空

如果对应的值为yes表示该字段可以为null
注意:

  1. 在设计表的时候,尽量不要让数据为空
  2. mysql的记录长度为65535个字节,如果一个表中有字段允许为null,那么系统就会设计保留一个字节来存储NULL,最终有效存储长度为65534个字节

默认值

default:默认值,当字段被设计的时候,如果允许默认条件下,用户不进行数据的插入,那么就可以使用事先准备好的数据来填充:通常填充的是NULL

测试:不给当前字段提供数据值

default关键字的另外一层使用:显式的告知字段使用默认值,在进行数据插入的时候,对字段值直接使用default

列描述

列描述:comment:是专门用于给开发人员进行维护的一个注释说明

基本语法:comment‘字段描述’;



查看comment:必须通过查看创建表语句

mysql10-类列表之mysql记录长度(varchar长度)

Posted on 2019-02-02 | In mysql

mysql记录长度

在mysql中,有一项规定:mysql的记录长度(record==行row)总长度不能超过65535个字节
varchar能过存储的理论值位65535个字符:字符在不同的字符集下可能占用多个字节

  1. 创建表:证明varchar在mysql中能够达到的理论值(utf8和GBK)
    varchar除了存储的数据本身要占用空间,还要使用额外的空间来记录长度

  1. 计算utf8和gbk下对应的varchar能够存储的长度

utf8下:65535/3=21845如果采用varchar存储:需要2个额外的字节保存长度,所以utf8最多能存储21844个字节




gbk下: 65535/2=32767 余1 如果采用varchar存储:需要额外2两个字节,
所以gbk下最多能存储32766个字符

mysql09-类列表之字符串类型

Posted on 2019-02-02 | In mysql

字符串类型

char

定长字符:指定长度之后,系统一定会分配指定的空间用于存储数据
基本语法: char(L),L代表字符数(中文与英文字母一样),L长度为0-255

varchar

变长字符:指定长度之后,系统会根据实际存储的数据来计算长度,分配合适的长度(数据没有超出长度)
基本语法:varchar(L) L代表字符集,L的长度理论值为0-65535

因为varchar要记录数据长度(系统根据数据长度自动分配空间),所以每个varchar数据产生之后,系统都会在数据后面增加1-2字节的额外开销,使用来保存数据占用的空间长度
如果数据本身小于127个字符:额外开销一个字节,如果大于127个,就开销两个字节
//百度百科资料显示:、使用额外的1-2字节来存储值长度,列长度<=255使用1字节保存,其它情况使用2字节保存。例如varchar(10)会占用11字节存储空间,varchar(500)会占用502字节存储空间。



char和varchar的区别

  1. char一定会使用指定的空间,varchar是根据数据来指定空间
  2. char的数据查询效率比varchar高;varchar是需要通过后面的记录数来计算
  3. 如果确定数据一定是占指定长度,那么使用char类型
    如果不确定数据到底有多少,那么使用varchar类型
    如果数据长度超过255字符,无论是否固定长度,都会使用text,不再使用char和varchar

text

文本类型:本质上mysql提供了两种文本类型
text:存储普通的字符文本
blob:存储二进制文本(图片,文件),一般都不会使用blob来存储文件本身,通常是使用一个链接来指向对应的文件本身

text系统中提供的四种text

tinttext:系统使用一个字节来保存(位置),实际能够存储的数据为2^8+1
text:使用两个字节保存,实际存储为;2^16+2
mediumtext:使用三个字节保存,实际存储为2^24+3
longtext: 使用四个字节保存,实际存储为2^32+4


注意:
1.在选择对应的存储文本的时候,不用刻意去选择text类型,系统会自动根据存储的数据长度来选择合适的文本类型(通常用text,让系统去选择)
2.在选择字符存储的时候,如果数据超过255字符,那么一定选择text存储

enum

枚举类型:在数据插入之前先设定几个项,而这几个项就是最终可能出现的数据结果。
如果确定某个字段的数据只有那么几个值;如性别:男、女、保密,系统就可以在设定字段的时候规定当前字段只能存放固定的几个值:使用枚举

基本语法: enum(数据值1,数据值2…)

系统提供1到2个字节来存储枚举数据:通过计算enum列举的具体指来选择实际的存储空间:如果数据值列表在255以内,那么一个字节就够,如果超过255但是小于65535,那么系统采用两个节字保存

实际操作及其特性

  1. 创建表
  2. 插入数据:合法数据,字段对应的值必须是设定表的时候所确定的值
  3. 错误数据:enum有规范数据的功能,能够保证插入的数据必须是设定的范围,其他的都不行
  4. 枚举enum的存储原理L实际上字段上所存储的值并不是真正的字符串,而是字符串对应的下标:当系统设定枚举类型的时候,会给枚举中每个元素定义一个下标,这个下标规则从1开始
    enum(1=>‘男’,2=>‘女’,3=>‘保密’)


    特性:在mysql中系统是自动进行类型转换的,如果数据碰到“+-*/”系统会自动把数据转换成数值,而普通字符串转换为数值0
    select 字段名 +0 from 表名

    5.既然实际enum字段存储的结果是数值:那么在插入数据的时候就可以使用对应的数值来进行

枚举的意义:

1.规范数据本身,限定只能插入规定的数据项
2.节省存储空间

set

集合是一种将多个数据选项可以同时保存的数据类型,本质是将指定的项按照对应的二进制来进行控制:1表示该选项被选中,0表示该选项没有被选中

基本语法:set (“值1”,“值2”。。。)

系统为set提供了多个字节进行保存,但是系统会自动计算来选择具体的存储单元
1个字节:set只能有8个选项
2个节字:set只能有6选项
3个节字:set只能有24选项
4个节字:set只能有64选项

实际操作及其特性

set和enum一样最终存储到字段中的依然是数字而不是真实的字符串

  1. 创建表
  2. 插入数据:可以插入多个数据,就是在数据插入的字符串中,使用对应的逗号将选项进行隔开
  3. 数据选项所在的数据与数据插入的顺序无关,最终都会变成选项对应的顺序
  4. 1.分析数据存储的方式:系统将对应的数据选项(设计)按照顺序进行编排:从第一个开始进行占位,每一个对应一个二进制位
    2.数据在存储的时候,如果被选中为1否则为0

    3.系统在进行存储的时候会自动将得到的最终的二进制颠倒过来,然后再进行转换成十进制存储
  5. 查看数据:按照转换成的数值来查看
  6. 既然是数值,那么就可以插入数值来代替实际插入数据



    注意:数字插入的前提是对应的二进制位上对应的数据项,通常不使用插入数值的方式

集合的意义

  1. 规范数据
  2. 节省存储空间

    enum与set

    enum单选框
    set复选框

mysql07-类列表之时间日期类型

Posted on 2019-02-01 | Edited on 2019-02-05 | In mysql

时间日期类型

date

日期类型:系统使用三个字节来存储数据,对应的格式为:YYYY-mm-dd,能表示的范围是从1000-01-01到9999-12-12,初始值为0000-00-00

time

时间类型:能表示某个指定的时间,但是系统同样提供3个字节来存储,对应的格式为HH:ii:ss,但是mysql中的time类型能够表示时间范围要大得多,能表示从-838:59:59~839:59:59,在mysql中具体的用处是用来描述时间段

timedatetime

日期时间类型:就是将前面的date和time合并起来,表示的时间,使用8个字节存储数据,格式为YYYY-mm-dd HH:ii:ss,能表示的区间1000-01-01 00:00:00 到9999-12-12 23:59:59,其可以为0值:0000-00-00 00:00:00

timestamp

时间戳类型:mysql中的时间只是表示从格林威治时间开始,但是其格式依然是YYYY-mm-dd HH:ii:ss

year

年类型:占用一个字节来保存,能表示1900-2155年,但是year由两种数据插入方式:0~99和四位数的具体年


  1. 创建对应的时间日期类型的数据表

  2. 插入正常数据

  3. year的特殊性:可以采用两位数的数据插入,也可以采用四位数的年份插入
  4. year进行两位数插入的时候,有一个区间划分,零界点为69和70.
    当输入69及以下的数,为20xx,当输入70及以上的数,为19xx
  5. timestamp特殊性
    当对应的数据被修改的时候,会自动更新(这个被修改的数据不是自己)
  6. time类型特殊性:本质是用来表示时间区间,能表示的范围比较大
  7. 在进行时间类型录入的时候(time)还可以使用一个简单的日期代替时间,在时间格式之前加一个空格,然后指定一个数字(可以是负数,表示天数),系统会自动将该数字转换成天数*24小时,再加上后面的时间

PHP中有着非常强大的时间日期转换函数:date将时间戳转换成想要的格式,strtotime又可以将很多格式转换成对应的时间戳。PHP通常不需要数据库来帮助处理这么复杂的时间日期,所以通常配合PHP使用的时候,时间的保存通常使用真正的时

mysql07-类列表之小数型

Posted on 2019-02-01 | In mysql

小数类型

专门用来存储小数的
在mysql中将小数类型又分为两类:浮点型和定点型

浮点型

浮点型又称之为精度类型:是一种有可能丢失精度的数据类型,数据有可能不那么准确(尤其在超出范围的时候)
之所以能存储较大的数值(不精确),原因就是利用存储数据的位来存储指数

float

float又称之为单精度类型,系统提供四个字节来存储数据,但是能表示的数据范围比整形大的多,大概是10的38次方;只能保证大概7个左右的精度(如果数据在7位数以内,那么基本是准确的,但是如果超过7位数,哪儿买就是不准确的)

基本语法
float:表示不指定小数位的浮点数
float(M,D):表示一共存储M个有效数字,其中小数位占D位
例如float(10,2) 整数部分为8位,小数部分为2位

  1. 创建数据表保存浮点数
  2. 插入合理数据

    注意:如果数据精度丢失,那么浮点型是按照四舍五入的方式进行计算
  3. 插入超出大小的数据

  4. 数据长度刚好满足条件,但是精度超出

说明用户不能插入数据直接超过指定的整数部分长度,但是如果是系统自动进位导致,系统可以承担

  1. 浮点数可以采用科学计算法来存储数据

浮点数的应用:通常是用来保存一些数量特别大,大到可以不用那么精确的数据。

double

double又称之双精度,系统用8个字节来存储数据,表示的范围更大,10的38次方,但是精度也只有15位左右

定点数

定点数,能够保证数据精确的小数(小数部分可能会不精确,超出长度会四舍五入),整数部分会一定精确

decimal

decimal定点数,系统自动根据存储的数据来分配存储空间,每大概9个数就会分配四个字节进行存储,同时小数和整数部分是分开的。
decimal(M,D):M表示总长度,最大值不能超过65,D代表小数部分长度,最长不能超过30

  1. 创建表:与浮点数对比
  2. 插入正常数据
  3. 插入最大数据(我们创建时已经设定了最大长度位10位,整数部分为8位)
  4. 插入最大数据,且让定点型的小数部分超过位数限制四舍五入后,整数部分进位超出限制,此时会报错!

定点数的应用:设计金额时使用较多的是定点数

mysql06-类列表之整数型

Posted on 2019-02-01 | In mysql

列类型

整数类型

tinyint

迷你整形,系统采用一个字节来保存的整形:一个字节=8位,最大能表示的数值是0-255

smallint

小整形,系统采用两个字节来保存的整形:能表示0-65535之间

mediumint

中整形,采用三个字节来保存数据

int

整形(标准整形),采用4个字节来保存数据

bigint

大整形,采用八个字节来保存数据

  1. 创建数据表
  2. 插入合理数据

  1. 插入错误数据(超出对应的数据范围)
  2. 错误原因:并不是说tinyint没有这么大的空间,而是因为mysql默认地为整形增加负数 实际区间为: -128~127


    实际应用中应该根据对应的数据的范围来选定对应的整形类型,通常使用的比较多的是tinyint和int

无符号标识设定

无符号表示存储的数据在当前字段中,没有负数(只有正数,区间为0-255)
基本语法:在类型之后,加上一个unsigned

显示长度

显示长度:指数据(整形)在数据显示的时候,到底可以显示多长位

tinyint(3):表示最长可以显示3位,unsigned说明只能是正数,0-255永远不会超过3位
tinyint(4):表示最长可以显示4位,-128~127

显示长度只是代表了数据是否可以到达指定的长度,但是不会自动满足到指定长度;如果想要数据显示的时候,保持最高位(显示长度),那么还需要给字段增加一个 zerofill属性才可以

zerofill:从左侧开始填充0(左侧不会改变数值大小),所以负数的时候就不能使用zerofill,一旦使用zerofill就相当于确定该字段位unsigned

数据显示的时候,zerofill会在左侧填充0到指定位,如果不足3位,那么填充到3位,如果本身已经够了或者超出,就不再填充


显示长度可以自己设定,超出长度但是不超出范围,不会影响,只会对不够显示长度的进行补充(显示长度)

例如我们使用

查看结果

1…6789

lh

89 posts
12 categories
© 2020 lh
Powered by Hexo v3.8.0
|
Theme – NexT.Pisces v6.7.0