1.概念:存储引擎即表类型,mysql根据不同的表类型会有不同的处理机制
2.查看存储引擎的方式
show engines;
3.mysql支持的存储引擎
MyISAM
MySQL5.5之前默认的存储引擎
不支持事务、行级锁和外键,针对数据的操作较于InnoDB不够安全
但是数据的存取速度较于InnoDB更快
InnoDB
MySQL5.5之后默认的存储引擎
支持事务、行级锁和外键,针对数据的操作更加安全
memory
基于内存存取数据
速度最快但是断电立刻丢失
blackhole
写入其中的数据都会立刻消失,类似于垃圾处理站
4.存储引擎创建表的不同点
create table t1(id int) engine=myisam;
create table t2(id int) engine=innodb;
cerate table t3(id int) engine=memory;
create table t4(id int) engine=blackhole;
'''
MyISAM会创建三个文件
.frm 表结构文件
.MYD 表数据文件
.MYI 表索引文件(索引是用来加快数据查询的)
InnoDB会创建两个文件
.frm 表结构文件
.ibd 表数据和表索引文件
memory
.frm 表结构文件
blackhole
.frm 表结构文件
'''
MySQL基本数据类型
1.整型
tinyint smallint int bigint
不同的int类型能够存储的数字范围是不一样的
是否存在负数(正负号需要占一个比特位)
# 移除正负号
create table t6(id tinyint unsigned);
2.浮点型
float double decimal
float(255,30) # 总共255位 小数位占30位
double(255,30) # 总共255位 小数位占30位
decimal(65,30) # 总共65位 小数位占30位
# 三者的精确度不一样
float < double < decimal
3.字符类型
char(4)
定长类型,最多只能存四个字符,多了报错少了自动空格填充至四个
varchar(4)
变长类型,最多只能存四个字符,多了报错少了有几个则存几个
# 针对5.6版本超出范围不会报错,而是自动帮你截取并保存(此行为不合理)
方式1:修改配置文件(永久)
方式2:命令修改(暂时)
show variables like '%mode%'
set session # 当前窗口有效
set global # 当前服务端有效
set global sql_mode='strict_trans_tables'
修改完毕后退出客户端重新进入即可
再次执行上述命令,会直接报错
# char_length() 统计某个字段数据的长度
'''底层确实会填充,但是取出来的时候又会自动去除'''
set global sql_mode='strict_trans_tables,pad_char_to_full_length'
char与varchar的对比
char
优势:整存整取 速度快
劣势:浪费存储空间
varchar
优势:节省存储空间
劣势:存取数据的速度较char慢
补充:在创建字段的时候可以加上相应的注释
create table t9(id int comment '序号',name char(4) comment '姓名');
整形中括号内数字的作用
create table t10(id int(3));
insert into t10 values(4444444);
'''
在整型中括号内的数字并不是用来限制存储的长度,而是用来控制展示的长度
在定义整型字段的时候,不需要自己添加数字,使用默认的就可以
'''
create table t11(id int(3) zerofill); # 宽度为3,不足用0补足
insert into t11 values(4); # 004
# 整型比较的特殊,是唯一一个不是用来限制存储长度的类型
枚举与集合类型
枚举enum()
多选一
create table user(id int,name varchar(32),gender enum('male','female'));
insert into user values(1,'ldb','male');
集合set()
多选多(包含了多选一)
create table userinfo(id int,name char(16),hoby set('basketball','football','reading'));
insert into userinfo values(1,'ldb','basketball,reading');
日期类型
date 年月日
datetime 年月日时分秒
time 时分秒
year 年份
create table client(id int,name varchar(32),reg_time date,birth datetime,study_time time,join_time year);
insert into client values(1,'ldb','2000-11-11','2000-1-21 11:11:11','11:11:11',1997);
创建表的完整语法
create table 表名(字段名1 字段类型(数字) 约束条件,...);
'''
1.字段名和字段类型是必须的
2.数字和约束条件是可选的,并且约束条件可以有多个 空格隔开即可
3.最后一个语句的结尾不要加逗号
'''
约束条件
unsigned # 让数字没有正负号
zerofill # 多余的使用数字0填充
not null # 非空
'''
新增数据的方式
方式1:按照字段顺序一一传值
insert into user values(值1,值2,...);
方式2:自定义传值顺序
insert into user(name,id) values('ldb',1);
在MySQL中不传数据,会使用关键字NULL填充意思就是空
'''
create table t3(id int,name varchar(32) not null);
default # 默认值
create table t4(id int,name varchar(32) default 'ldb');
unique # 唯一值
# 单列唯一
create table t5(id int,name varchar(32) unique);
# 联合唯一
create table t6(id int,host varchar(32),port int,unique(host,port));
primary key # 主键
'''
从约束层面上来说,相当于是not null+unique(非空且唯一)
在此基础上还可以加快数据的查询
InnoDB存储引擎规定了一张表必须有且只有一个主键
因为InnoDB是通过主键的方式来构造的
如果没有设置主键
情况1:没有主键和其它约束条件
InnoDB会采用隐藏的字段作为主键,不能加快数据的查询
情况2:没有主键但是有非空且唯一的字段,自动将该字段升级为主键
create table t7(id int,age int not null unique,pwd int not null unique);
create table user(id int primary key,name varchar(32));
'''
auto_increment # 自增
'''
由于主键类似于数据的唯一标识,并且主键一般都是数字类型
在添加数据的时候不可能记住接下来的序号是多少
'''
create table user1(id int primary key auto_increment,name varchar(32));
自增不会因为删除操作而回退
delete from无法影响自增
如果想要重置需要使用truncate关键字
truncate 表名 # 清空表数据并且重置主键