存储引擎
数据库存储引擎是数据库底层软件组织,数据库管理系统(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<double<decimal
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');