一、存储引擎
不同的数据应该有不同的处理机制
1.mysql存储引擎
Innodb:默认的存储引擎,查询速度较myisam慢,但是更安全
myisam:mysql老版本用的存储引擎
memory:内存引擎(数据全部存在内存中)
blackhole:无论存什么,都立马消失(黑洞)
2.查看所有的存储引擎
show engines;
3.研究一下每个存储引擎存取数据的特点
(1)Innodb:两个文件,一个是表结构文件,一个是真实数据文件
(2)myisam:三个文件,表结构文件,真实数据文件,索引文件(目录)
(3)memory:一个文件,表结构文件
(4)blackhole:一个文件,表结构文件
二、创建表的完整性约束
1.创建表的完整语法
create table 表名(
字段名1 类型[(宽度) 约束条件],
字段名2 类型[(宽度) 约束条件],
字段名3 类型[(宽度) 约束条件]
);
注意:
(1)字段名和字段类型是必须的 中括号内的参数都是可选参数
(2)同一张表中字段名不能重复
(3)最后一个字段后面不能加逗号,例如:
create table t6( id int, name char, ); # 错误
宽度:
(1)使用数据库的准则:能尽量让它少干活就尽量少干活
(2)对存储数据的限制:char(1),只能存一个字符
1.如果超了,mysql会自动帮你截取
2.会直接报错(mysql严格模式)
类型和中括号内的约束条件有什么区别:
类型约束的是数据的存储类型
而约束条件是基于类型之上的额外限制
2.约束条件:如何限制一个字段不能插空
alter table t5 modify name char not null;
not null 约束条件,该字段不能插空
三、严格模式
我们刚刚在上面设置了char,tinyint,存储数据时超过它们的最大存储长度,发现数据也能正常存储进去,只是mysql帮我们自动截取了最大长度。但在实际情况下,我们应该尽量减少数据库的操作,缓解数据库的压力,让它仅仅只管理数据即可,这样的情况下就需要设置安全模式
1.模糊匹配
like
%匹配任意多个字符
_匹配任意一个字符
show variables like "%mode%"; # 查看数据库配置中变量名包含mode的配置参数
2.修改严格模式
set session:临时有效,只在你当前操作的窗口有效
set global:全局有效,终生有效
set global sql_mode = 'STRICT_TRANS_TABLES';
修改完之后退出当前客户端重新登陆即可
四、字段类型
1.整型
SMALLINT、TINYINT、INT、BIGINT
TINYINT
create table t6(id TINYINT);
默认是带有符号的(-128,127)
超出之后只会存最大值或者最小值
怎样改成无符号
alter table t6 modify id TINYINT unsigned;
就改成无符号的(0,255)
INT
也是默认带有符号的
超出之后只会存最大值或者最小值
改成无符号与上方法一致
括号内的数字
char后面的数字是用来限制存储数据的长度的
特例:
只有整型后面的数字不是用来限制存储数据的长度,而是用来控制展示的数据的位数
int(8):够/超8位有几位存几位,不够8位空格填充
zerofill:修改约束条件,不够8位的情况下,用0填充
强调:
***对于整型来说,数据类型后的宽度并不是存储限制,而是显示限制,所以在创建表时,如果字段采用的是整型类型,完全无需指定显示宽度, 默认的显示宽度,足够显示完整当初存放的数据
只要是整型,都不需要指定宽度,因为有默认的宽度,足够显示对应的数据
约束条件:
not null 不能为空
unsigned 无正负符号
zerofill 0填充多余的位数
2.浮点型
float(255,30):总共255位,小数部分占30位
double(255,30):总共255位,小数部分占30位
decimal(65,30):总共65位,小数部分占30位
前一位表示所有的位数,后一位表示小数个数
精确度
验证
create table t12(id FLOAT(255,30)); create table t13(id DOUBLE(255,30)); create table t14(id DECIMAL(65,30)); insert into t12 values(1.111111111111111111111111111111); insert into t13 values(1.111111111111111111111111111111); insert into t14 values(1.111111111111111111111111111111);
精确度:float < double < decimal
3.字符类型
char(4):最大只能存四个字符,超出来会直接报错,如果少了,会自动用空格填充
varchar(4):最大只能存四个字符,超出来会直接报错,如果少了,有几个存几个
create table t15(name char(4));
create table t16(name varchar(4));
char_length():获取一个字符的长度
mysql在存储char类型字段的时候,硬盘上确确实实存的是固定长度的数据,但是在取出来的那一瞬间,mysql会自动将填充的空格去除
可以通过严格模式,来修改该机制,然后退出客户端重新登陆,这样mysql就不做自动去除末尾空格的操作,
set global sql_mode="strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH";
char与varchar的使用区别
name char(5):char定长
优点:存取速度都快
缺点:浪费空间
name varchar(5):varchar变长
优点:节省空间
缺点:存取速度慢(较于char比较慢)
存的时候,需要给数据讲一个记录长度的报头
取的时候,需要先读取报头才能读取真实数据
4.日期类型
date:2019-05-01 年月日
datetime: 2019-01-02 11:11:11 年月日时分秒
time:11:11:11 时分秒
year:2019 年
测试:
create table student( id int, name char(16), born_year year, birth date, study_time time, reg_time datetime ); insert into student values(1,'egon','2019','2019-05-09','11:11:00','2019-11-11 11:11:11');
5.枚举与集合类型
分类
枚举enum:多选一
集合set:多选多
测试
create table user( id int, name char(16), gender enum('male','female','others') ); insert into user values(1,'jason','xxx') # 报错 insert into user values(2,'egon','female') # 正确!
create table teacher( id int, name char(16), gender enum('male','female','others'), hobby set('read','sleep','sanna','dbj') ); insert into teacher values(1,'egon','male','read,sleep,dbj') # 集合也可以只存一个
五、约束条件
1.not null:不能为空
2.default:给某个字段设置默认值(当用户写了的时候用用户的,当用户没有写就用默认值)
create table t17(id int,name char(16) default 'jason');
往表中插入数据的时候,可以指定字段进行插入,不需要全部都插入
insert into t17(name,id) values('egon',2);
3.unique:唯一
单列唯一:限制某一个字段是唯一的
create table user1( id int unique, name char(16) ); insert into user1 values(1,'jason'),(1,'egon') # 报错 insert into user1 values(1,'jason'),(2,'egon') # 成功
联合唯一:在语句的最后,用括号的形式,表示哪几个字段组合的结果是唯一的
create table server( id int, ip char(16), port int, unique(ip,port) ) insert into server values(1,'127.0.0.1',8080); insert into server values(2,'127.0.0.1',8080); # 报错 insert into server values(1,'127.0.0.1',8081);
4.primary key:主键
限制效果跟 not null + unique 组合效果一致,非空且唯一
create table t11(id int primary key); desc t11; insert into t11 values(1),(1); # 报错 insert into t11 values(1),(2);
primary key也是innodb引擎查询必备的索引
innodb引擎在创建表的时候,必须要有一个主键
当你没有指定主键的时候
1.会将非空且唯一的字段自动升级成主键
2.当你的表中没有任何的约束条件,innodb会采用自己内部默认的一个主键字段
该主键字段你在查询时候是无法使用的
查询数据的速度就会很慢
类似于一页一页的翻书
create table t12( id int, name char(16), age int not null unique, addr char(16) not null unique );
主键字段到底该设置给谁
通常每张表里面都应该有一个id字段
并且应该将id设置为表的主键字段
联合主键
***多个字段联合起来作为表的一个主键,本质还是一个主键***
***PS:innodb引擎中一张表有且只有一个主键***
主键字段应该具备自动递增的特点:primary key auto_increment
主键id作为数据的编号,每次最好能自动递增
每次添加数据,不需要用户手动输入
auto_increment:自动递增
create table t13( id int primary key auto_increment, name char(16) ); insert into t13('jason'),('jason'),('jason'); # id字段自动从1开始递增 # 注意:auto_increment通常都是加在主键上,并且只能给设置为key的字段加
补充:
delete from t21; 仅仅是删除数据,不会重置主键
这条命令确实可以将表里的所有记录都删掉,但不会将id重置为0,所以收该条命令根本不是用来清空表的,delete是用来删除表中某一些符合条件的记录
truncate t21; 初始化表,会重置主键
将整张表重置,id重新从0开始记录