当前位置: 首页 > news >正文

MySQL数据库基础2

文章目录

  • 数据类型
  • 表的约束

数据类型

1、数值类型:BIT、TINYINT、BOOL、SMALLINT、INT、BIGINT、FLOAT[(M,D)]、DOUBLE[(M,D)]、DECIMAL[(M,D)]

  • FLOAT[(M,D)]:占用四个字节,M表示显示位数,D表示小数位数,精度保证:6~7位
  • DOUBLE[(M,D)]:占用八个字节,M表示显示位数,D表示小数位数,精度15~16位

上面两种类型需要引起注意的是,M和D会限制数据的大小范围,举例如下:

在这里插入图片描述

在上表中插入数据:

在这里插入图片描述

报错原因是尝试插入的值1.2超过了该列的数据类型范围。

Type的double(3,3)表示了插入的数据不能大于1了,所以要注意M和D带来的数据范围的限制。

  • DECIMAL[(M,D)]:是MySQL自有的一个类型,M表示显示位数,D表示小数位数,它不是按照浮点数来进行存储的,它是按照字符串来进行存储的,所以理论上来说,精度不会丢失,但是在存储的时候,一定确定存储的小数和D的关系。M最大为65,D最大为30.
    在这里插入图片描述

2、文本、二进制类型:CHAR(size)、VARCHAR(size)、TEXT(大文本类型)、BLOB(二进制类型)

  • 固定长度字符串

char(size):固定长度字符串,size是可以存储的长度(个数),单位为字符,最大长度值可以为255
每个字符所占的字节和字符集强相关

  • 可变长度字符串

varchar(size):可变长度字符串,size表示该字段可以存储的最大字符数,最大长度为65535个字节

size最大有多大:

需要1~3字节用来记录字符串的长度(因为长度可变),按照最大情况计算,所以剩余字节数量就是65532;
在utf8字符集中,字符占用的字节数量为1~3字节,所以按照最大3字节计算,可以存储65535/3=21844个字符;

size的大小和字符集息息相关。size所指定的字符数是指该字段所占用的字节数的上限,并不是存储的实际字符数,例如,如果使用‘utf8mb4’字符集(一个中文字符占用四个字节),则 varchar(50)的字段可以存储12个中文字符。

如何选择定长或变长字符串呢?

如果数据确定长度都一样,就使用定长(char),比如身份证号、手机号等
定长的磁盘空间比较浪费,但是效率高,直接开辟好对应的空间
变长的磁盘空间比较节省,但是效率低,在不超过自定义范围的情况下,用多少,开辟多少

3、时间/日期类型

  • date:日期,yyyy-mm-dd,年月日,占用三个字节
  • datetime:时间日期,yyyy-mm-dd HH:ii::ss ,表示范围从1000到9999,占用八字节
  • timestamp:时间戳,从1970年开始的,yyyy-mm-dd HH:ii:ss,格式和datetime完全一致,计算的是秒数,占用四个字节,时间戳可用于统一软件时间
    在这里插入图片描述

我们在t3这张表中插入数据,多次执行下面这条语句:

insert into t3(d1,d2) values('2023-05-13','2023-05-13 17:11:10');

插入多条数据后,我们来看一下表中数据结果:

在这里插入图片描述

时间戳是自动插入的,可以看到,它是在变化的,随着时间流动而流动。

4、枚举类型

enum(’ 选项1’,选项2’,’选项3’,…);

枚举的设定提供了若干个选项的值,最终的一个单元格中,实际只存储了枚举选项中的一个值
在插入时,不能插入枚举选项中没有的值。

在这里插入图片描述

5、集合类型

set(’ 选项1’,选项2’,’选项3’,…);

集合设定提供了若干个选项的值,最终的一个单元格中,可以存储选项的任意多个值。这点是和枚举的差别,枚举只允许存储一个值。

在这里插入图片描述

集合查询使用find_in_set函数

find_in_set(sub, str_list):如果sub在str_list中,则返回下标,如果不在,返回0;str_list是用逗号分隔的字符串

在这里插入图片描述

表的约束

表的约束是指除列字段类型约束之外的额外约束。

1、空约束

null:该属性值可以为空
not null:该属性值不可以为空,如果要求哪个属性值不能为空,在create表的时候加上not null。

在这里插入图片描述

2、默认值

在列定义的后面,加上default [value];

当插入数据的时候,提供的数据不包含有默认值的列时,采用默认值

在这里插入图片描述

3、列描述

comment:列描述,对于插入/删除/查询没有影响,相当于是列注释(给开发者准备的)

我们创建一个表:

create table t1(id int comment 'stu id', name varchar(10) default 'xh' comment  'name');

显示一下表的创建过程:

在这里插入图片描述

4、zerofill格式化输出

设置了zerofill的字段会按照设定的宽度进行输出。如果本身宽度不够,高位补0,但是在真实存储的时候,还是按照原生的数字进行存储的。

在这里插入图片描述

int(5)在输出的时候,就会输出5位。

5、主键(主键约束)

主键是用于唯一标识数据库表中每一行记录的一列或者一组列,主键的值必须唯一、非空,并且在表的每一行记录中唯一标识该行记录,主键可以由一列或多列组成,如果由多列组成,则称为复合主键。

主键可以帮助提高数据的查询效率,并确保数据的一致性和完整性,主键常常和外键一起使用,来构建数据库之间的关系。

约束列字段关键词:primary key

需要注意的是:

主键不能为空,不能重复;
一张表只能有一个主键;
主键列通常为整数(方便建立索引)

主键不能为空:

![在这里插入图片描述](https://img-blog.csdnimg.cn/cc14e5351af6484699ccb1a3351edfb2.pn

在这里插入图片描述

主键不能重复:

在这里插入图片描述

创建主键的几种方式:

1)创建表时指定主键

  • 直接在某个字段后面指定

create table [表名称] (字段1 字段1类型 primary key,…);

在这里插入图片描述

  • 在所有字段后面指定主键

create table [表名称] (字段1 字段1类型,字段2 字段2类型,字段3 字段3类型 primary key,(字段名称));

在这里插入图片描述

2)alter修改表结构

alter table [表名称] add primary key([列名称])

删除主键:

alter table [表名字] drop primary key;

复合主键:

指的是多个列共同组成的主键,可以唯一标识一条记录,由于复合主键包含多列,因此可以更加准确地确定记录的唯一性。

6、自增长

auto_increment是MySQL中自增长的关键字,被设置为自增长的字段,如果不提供数据,会自动的被系统触发,系统会从当前字段中已有的最大值+1操作,得到一个新的不同的值。

在这里插入图片描述
自增长的特点:

任何一个字段要做自增长,前提是本身是一个索引;自增长字段必须是整数;一张表最多只能有一个自增长

7、唯一键
一张表中往往有很多字段数据不能重复,需要唯一性,可能会有人想,那就把这样的字段设置有主键,但是需要注意的是一张表中只能有一个主键,所以主键解决不了这个问题,这个时候,唯一键就出现了,用来解决表中有多个字段需要唯一性约束的问题。

关键字:unique
唯一键不能重复,可以为空。

8、外键

外键是用来建立两个表之间关联的一种机制,用于保证数据的一致性和完整性。
在关系型数据库中,可以通过外键将两个表联系起来,使得一个表中的某一个或某几列可以引用另一个表中的主键,从而在两个表之间建立关联关系。

在MySQL中,外键约束可以通过FOREIGN KEY关键字来实现,需要满足以下条件:

  • 外键必须引用另一个表的主键或唯一键
  • 外键约束只能在InnoDB存储引擎中使用
  • 外键约束需要满足参照完整性约束,即要求在添加或更新记录时,外键值必须与另一个表中的主键或唯一键值相匹配

两个表从逻辑上区分为主表和从表,外键的约束定义在从表上,主表的字段需要是主键。
从表定义的外键,本质上是通过主表的字段值,来约束从表当中的外键列

如何定义外键:

foreign key(字段名)reference 主表(列)
在从表中定义外键。

使用外键约束可以避免不必要的数据冗余,提高数据的一致性和完整性,但是同时会增加操作的复杂度。

http://www.lryc.cn/news/67816.html

相关文章:

  • AutoSAR PNC和ComM
  • Android studio Camera2实现的详细流程
  • 阿里云数据库ClickHouse产品和技术解读
  • 分子动力学基础知识
  • USB转UART转串口芯片 GP232RNL国产低成本替代FT232RL/FT232RNL
  • 第03讲:SpringCloudStream实现分布式事务
  • 【从零开始学Skynet】高级篇(一):Protobuf数据传输
  • 快速入门Lombok
  • Linux 常见命令与常见问题解决思路
  • 用GPT-4 写2022年天津高考作文能得多少分?
  • Django如何把SQLite数据库转换为Mysql数据库
  • 使用apisix代理静态文件
  • [元带你学NVMe协议] NVMe1.4 多路径(Multipathing)
  • Elasticsearch:如何使用自定义的证书安装 Elastic Stack 8.x
  • HADOOP--yarn ,, git
  • IOS开发指南之UITableView控件使用
  • C语言中的数据类型
  • 什么是微服务中的熔断器设计模式?
  • Ubuntu查看系统日志的几种方法
  • 【ubuntu】安装ZIP
  • DiffDock源码解析
  • 1099 Build A Binary Search Tree(超详细注解+38行代码)
  • [刷题]贪心入门
  • 项目集战略一致性
  • Linux学习 Day3
  • 前端开发推荐vscode安装什么插件?
  • 如何打造完整的客户服务体系?
  • 裸奔时代,隐私何处寻?
  • 从期望最大化(EM)到变分自编码器(VAE)
  • 【数学杂记】表达式中的 s.t. 是什么意思