存储引擎
数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。
可以简单的理解为是处理同一数据的不同方式。
MySQL主要存储引擎
MyISAM
MySQL5.5之前的默认存储引擎,数据的存储速度较InnoDB更加快。
InnoDB
MySQL5.5之后的默认存储引擎,具有事务,行级锁,和外键的功能,数据的安全性更高,数据的存储速度较慢
memory
基于内存存储数据,速度最快,但是断电后会立刻丢失
blackhole
使用该引擎写入数据会立马消失,类似于垃圾处理站
不同引擎创建表的区别
# 创建不同的表
create table t1(id int) engine=myisam;
create table t2(id int) engine=innodb;
create table t3(id int) engine=memory;
create table t4(id int) engine=blackhole;
"""
MyISAM会创建三个文件
.frm 表结构文件
.MYD 表数据文件
.MYI 表索引文件(索引是用来加快数据查询的)
InnoDB会创建两个文件
.frm 表结构文件
.ibd 表数据和表索引文件
memory
.frm 表结构文件
blackhole
.frm 表结构文件
"""
严格模式
# 针对MySQL5.6版本数据超出范围不会报错 而是自动帮你截取并保存(此行为不合理)
方式1:修改配置文件(永久)
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
方式2:命令修改(暂时)
show variables like '%mode%'
set session # 当前窗口有效
set global # 当前服务端有效
set gloabl sql_mode = 'strict_trans_tables'
修改完毕后退出客户端重新进入即可
再次执行上述插入命令 会直接报错
基本数据类型
整型
分类:tinyint,smallint,int,bigint
区别:不同的int类型能够储存的范围是是不一样的,bigint>int>smallint>tinyint
'''研究默认是否需要正负号'''
create table t1(id tinyint);
insert into t1 values(-999),(999);
# 结论:所有的int类型默认都需要正负号
create table t6(id tinyint unsigned); # 移除正负号
insert into t6 values(-999),(999);
整型中括号内数字的作用
id int(8)
如果数字没有超出8位 那么默认用空格填充至8位
如果数字超出了8位 那么有几位就存几位(但是还是要遵守最大范围)
"""
create table t13(id int(8) unsigned zerofill);
# 用0填充至8位
# 总结:
针对整型字段 括号内无需指定宽度 因为它默认的宽度以及足够显示所有的数据了
浮点型
分类:float,double,decimal
区别:三者的精确度不同,float
float(255,30) # 总共255位 小数位占30位
double(255,30) # 总共255位 小数位占30位
decimal(65,30) # 总共65位 小数位占30位
"""研究三者的不同"""
create table t7(id float(255,30));
create table t8(id double(255,30));
create table t9(id decimal(65,30));
insert into t7 values(1.11111111111111111111111);
insert into t8 values(1.11111111111111111111111);
insert into t9 values(1.11111111111111111111111);
字符类型
char:定长类型,定义了多少字节的长度,在输入时超过这个长度便会报错,比这个长度少便会使用空格填充到定义的长度。
优点:数据存取方便,速度快
缺点:浪费了存储空间
varchar:变长类型,定义了多少字节的长度,在输入时超过这个长度便会报错,比这个长度少便有几个存几个。
优点:节省了存储空间
缺点:数据存取麻烦,需要有1bytes来先制作报头,然后获取报头再获取数据。
mysql> create table t1(name char(5));
mysql> create table t2(name varchar(5));
mysql> insert into t1 values('jjk');
mysql> insert into t2 values('jjk');
# char类型里的数据在取出时会自动消除空格 可以设置以下语句取消
set global sql_mode = 'strict_trans_tables,pad_char_to_full_length'
给字段增加注释
# 增加注释
mysql> create table t2(id int comment '序号');
# 查看注释
mysql> show create table t3;
枚举与集合
枚举:设置字段的时候有多个选项,只能从这个几个选项中选择一个
集合:设置字段的时候有多个选项,可以选择一个或者多个
# 设置枚举
mysql> create table t1(gender enum('男','女'));
# 设置集合
mysql> create table t2(hobby set('篮球','足球','网球'));
# 给表中加入记录
mysql> insert into t1 value('男'); # 成功
mysql> insert into t1 value('女'); # 成功
mysql> insert into t1 value('man');# 报错
mysql> insert into t2 values('篮球,网球,足球'); # 成功
mysql> insert into t2 values('足球'); # 成功
时间类型
分类:
date:年月日
datatime:年月日时分秒
time:时分秒
year:年份
mysql> create table t1(time datetime);
mysql> insert into t1 values('2022-2-18 19:20:20');
创建表的完整语法
create table 表名(
字段名1 字段类型(数字) 约束条件,
字段名2 字段类型(数字) 约束条件,
字段名3 字段类型(数字) 约束条件
);
"""
1.字段名和字段类型是必须的
2.数字和约束条件是可选的 并且 约束条件可以有多个空格隔开即可
3.最后一个语句的结尾不要加逗号
"""
约束条件
unsigned:让数字没有负数
mysql> create table t1(id int unsigned);
mysql> insert into t1 values(-100); # 报错
mysql> insert into t1 values(100);
zerofill:当字段类型是char时,输入的值小于设定的字节时,使多余的部分使用数字0填充
mysql> create table t2(name int zerofill);
mysql> select * from t2;
not null:非空,当表中的记录为空时就会报错
"""
新增表数据的方式
方式1: 按照字段顺序一一传值
insert into t1 values(1,'jack');
方式2: 自定义传值顺序 甚至不传
insert into t1(name,id) values('jack',1);
insert into t1(id) values(1);
在MySQL中不传数据 会使用关键字NULL填充意思就是空 类似于python的None
"""
mysql> create table t3(id int, name char(6) not null );
mysql> insert into t3(id) values(2); # 报错
mysql> insert into t3(id,name) values(2,'jack'); #添加成功
default:设置默认值,如果没有输入则使用默认值,输入值就使用输入的值
mysql> create table t5(id int,name char(5),
gender enum('male','female') default 'male'); # 创建表
mysql> insert into t5(id,name) values(1,'xk'); # 添加记录
mysql> select * from t5; # 查看表记录
unique:唯一值,设置了该条件表中不能出现与该数据相同的数据
# 单列唯一
mysql> create table t6(id int unique); # 创建表
mysql> insert into t6 values(1); # 添加成功
mysql> insert into t6 values(1); # 报错
#联合唯一
mysql> create table t7(id int, name char(5),unique(id,name));
mysql> insert into t7 values(1,'abc'); # 添加成功
mysql> insert into t7 values(1,'asd'); # 添加成功
mysql> insert into t7 values(2,'asd'); # 添加成功
mysql> insert into t7 values(1,'abc'); # 报错
primary key:主键
单从约束条件上来讲,主键的功能相当于not null + unique(非空且唯一),在此基础上还可以加快数据的查询
InnoDB引擎规定了一张表有且只有一个主键
如果在创建表的时候没有设置主键,InnoDB引擎会采用隐藏的字段称为主键,该情况不能加快数据的查询
如果某个字段拥有非空且唯一的约束条件,并且从上至下是最上面的位置,那么该字段就会自动升级成主键
create table t6(
id int,
age int not null unique, # 该键会称为主键
pwd int not null unique
);
结论:我们在创建表的时候应该主动设置一个主键,一般情况都会将表的id字段设置为主键
auto_increment:自增
在设置id字段的时候,一般都是以数字慢慢增加,该约束条件可以帮助我们不需要手动输入id值,系统会自动帮我们记录。
mysql> create table t8(id int primary key auto_increment,
name varchar(32)); # 创建表
mysql> insert into t8(name) values('xk'),('xzj'),('jrm'); # 添加记录
mysql> select * from t8; # 查看表记录
自增的特性
自增不会因为删除操作而回退
# 删除记录
mysql> delete from t8 where id=1;
mysql> delete from t8 where id=3;
# 添加记录
mysql> insert into t8(name) values('xk');
mysql> insert into t8(name) values('jrm');
# 查看记录
mysql> select * from t8;
重置自增
重置自增需要使用truncate关键字
# truncate 表名 清空表数据并且重置主键值
truncate t8;
查找记录
select * from t8; # Empty set (0.00 sec) 没有数据
# 添加记录
mysql> insert into t8(name) values('xk');