MySQL存储引擎
Innodb : 默认的存储引擎,查询速度相对myisam慢,但是更安全 特点是支持行锁,支持外键
myisam : 老版本的存储引擎
memory : 内存引擎,数据全部存在内存中,断电数据消失
blackhole : 黑洞引擎,无论存什么数据,立马消失
查看存储引擎 show engines;
创建对饮存储引擎的表
create table t1(id int) engine=innodb; create table t2(id int) engine=myisam; create table t3(id int) engine=memory; create table t4(id int) engine=blackhole;
表操作
基本数据类型与约束条件
创建表的完整语法
# 语法: create table 表名( 字段1 类型(宽度) 约束条件, 字段2 类型(宽度) 约束条件, 字段3 类型(宽度) 约束条件, ); # 注意: 1.同一表中,字段名不能相同 2.字段名和字段类型必须有,宽度和约束条件可以没有 3.最后一个字段后不能加逗号 # 补充: # 1.宽度是对存储数据的限制 例: create table userinfo(name char); # char默认宽度是1,存储一个字符 insert into userinfo values('xiaoming'); # 存储 x 或 报错 ``` 1.没有安全模式的数据版本,能存储数据,但只能存储一个字符x,mysql自动截取一个字符,消耗资源. 2.有安全模式的版本直接报错:Data too long for column 'name' at row 1 ``` # 2.初始约束条件 >>> null 与 not null 例: create table record(id int,name char not null); insert into record values(1,'x'); # 正常存储 insert into record values(1,null); # 报错 # 总结: # 类型:限制字段必须以什么样的数据类型存储 # 约束条件: 是类型之外添加额外的限制
严格模式
普通模式下存储数据时若超过了他们的最大宽度,数据也能正常存储,那是因为mysql帮我们自动截取了最大长度,但在实际情况下,我们应该尽量减少数据库的操作,缓解数据库的压力,让它仅仅只能管理数据即可,所以苏姚设置安全模式(严格模式)
show variables like "%mode%"; # 查看数据可配置中变量名包含mode的配置参数(模糊匹配) # 修改安全模式 set session # 只在当前操作界面有效 set global # 全局有效 set global sql_mode = 'STRICT_TRANS_TABLES' # 修改完之后退出当前客户端重新登录即可
数据类型
整形
-
分类 : TINYINT SMALLINT MEDIUMINT INT BIGINT
-
作用 : 存储 id,年龄,号码等
存储范围
验证整形字段有无正负符号及范围
# unsigned 有符号转无符号 create table t5(id tinyint); insert into t5 values(128),(-129); # 安全模式(严格模式)下报错,否则按范围存储为127 / -128 create table t6(id tinyint unsigned); insert into t6 values(-1),(256); # 补充: 其他整形也是如此,只是范围不同
疑问: 类型后面的宽度能否改变字段存储的大小限制
create table t7(id int(8)); insert into t7 values(1234567890); # 超出8位正常存储 insert into t7 values(123): # 少于8位用空格补充 # unsigned zerofill 显式时,不够8位改为用0补充,如果超8位正常显式 create table t8(id int(8) unsigned zerofill); insert into t8 values(1234567890); insert into t8 values(1);
# 强调:
对于整型来说,数据类型后的宽度并不是存储限制,而是显式限制,所以在创建表时,如果字段采用的是整型类型,完全无需指定显式宽度,默认的显式宽度足够显式完整当初存放的数据
浮点型
-
分类 : float double decimal
-
应用场景 : 身高,体重,薪资
字段限制特点 如(5,3) 前一位表示所有的位数,后一位表示小数个数
三者最大整数位和小数位对比:
# 存储限制 float(255,30) double(255,30) decimal(65,30) # 精确度验证 create table t9(id float(255,30)); create table t10(id double(255,30)); create table t11(id decimal(65,30)); insert into t9 values(1.111111111111111111111111111111); insert into t10 values(1.111111111111111111111111111111); insert into t11 values(1.111111111111111111111111111111); # 总结: # 精度:float < double < decimal
字符类型
-
分类
-
char(定长)
-
varchar(变长)
-
-
作用: 姓名,地址,描述类信息
create table t12(name char(4)); # 宽度为4字符,超出报错,不够用空格补充 create table t13(name varchar(4)); # 宽度为4字符.超出报错,不够是多少字符存多少个字符 insert into t12 values('x'); # 正常存储,用空格部位,在硬盘中占4个字符位 insert into t13 values('y'); # 正常存储,在硬盘中只占一个字符位 ''' 针对char类型,首先肯定的是在硬盘上存的绝对是真是数据,但显式的时候mysql会自动将首末尾的空格去掉 ''' # 如果不想mysql帮你自动去除收尾的空格,需要添加一个模式 set global sql_mode='PAD_CHAR_TO_FULL_LENGTH'; # 退出客户端重新登录 select char_length('x') from t12; select char_length('y') from t13; # 总结: char # 特点:存入的字符宽度若不够,用空格补位,在硬盘中存的是空格加字符 # 缺点:浪费空间 # 优点:存取速度快 'xiao' ' wxx' ' lxx' carchar # 特点:存入的字符宽度若不够,是几个字符存几个字符,但会在字符前加一个bytes标记字符,类似报头 # 缺点:存取速度慢 # 优点:节省空间 '1bytes+xiao' '1bytes+wxx' '1bytes+lxx'
时间类型
分类
-
date : 年-月-日
-
time : 时:分:秒
-
-
Year : 年
create table t14( id int, name char(16), Year year, Date date, Time time, DateTime datetime ) insert into t14 values(1,'xiaoming','2019','2019-08-19','08:01:00','2019-08-19 08:01:00');
枚举与集合类型
分类
-
枚举enum 多选一
-
集合 set 多选多
# 枚举 enum create table t15( id int, name char(16), gender enum('male','female','others') ) insert into t15 values(1,'xiaoming','xxx'); # 报错 insert into t16 values(1,'xiaoming','male'); # 正确 # 集合 set create table t16( id int, name char(16), gender enum('male','female','other'), hobby set('read','sleep','playgame','dbj') ); insert into t16 values(1,'hanmm','female','read,sleep,dbj');
约束条件
''' primary key (pk) 标识该字段为该表的主键,可以唯一标识记录 foreign key (fk) 标识该字段为该表的外键 not null 标识该字段不能为空 unique key (uk) 标识该字段值得唯一性 auto_increment 标识该字段的值自动增长(整数增长,且为主键) default 为该字段设置默认值 unsigned 无符号 zerofill 使用0填充 '''
not null + default
# not null create table t17( id int, name char(16) ); insert into t17 values(1,null); # 将name字段约束条件改为 not null alter table t17 modify name char(16) not null; insert into t17 values(2,null); # 报错 insert into t17(name,id) values('xiaoming',2); # 插入数据时,可以指定字段插入 # default create table t18( id int, name char(16) default 'xiaoming' gender enum('male','female','other') default 'male' ); insert into t18(id) values(1); # 当使用默认值时语法 insert into t18(id,name) values(2,'lilei');
unique
# 单例唯一 限制某一个字段的唯一性 create table t19( id int unique, name char(16) ); insert into t19 values(1,'lilei'),(1,'xiaoming'); insert into t19 values(1,'lilei'),(2,'xiaoming'); # 联合唯一 在语句最后,用括号形式表示那几个字段组合的结果是唯一的 create table t20( id int, ip char(16), port int, unique(ip,port) ); insert into t20 values(1,'127.0.0.1',8080),(2,'127.0.0.1',8080); # 报错 insert into t20 values(1,'127.0.0.1',8080),(1,'127.0.0.1',8081);
primary key + auto_increment
# primary key # 单从约束的角度来说 primary key 等价于 not null + nuique create table t21(id int primary key); desc t21; insert into t21 values(1),(null); # 报错 不能为空 insert into t21 values(1),(1); # 报错 单列唯一 insert into t21 values(1),(2);
# 除了约束条件外,主键还是innodb引擎组织数据的依据,提升查找效率(类似书的目录) ''' 强调: 1.一张表中有且只有一个主键,如果你没有设置主键,那么会从上到下搜索,直到遇到一个非空且唯一的字段自动将其设置为主键 ''' create table t22( id int, name char(16), age int not null unique, addr char(16) not null unique )engine=innodb; desc t22; ''' 2.如果表里面没有指定任何的可以设置为主键的字段,那么innodb会采用自己默认的一个隐藏的字段作为主键,隐藏意味着你才查询的时候无法根据这个主键字段加速查询 3.一张表中通常应该有一个id字段,并将id字段作为主键 '''
# 联合主键:多个字段联合起来作为表的一个主键,本质还是一个主键 create table t23( ip char(16), port int, primary key(ip,port) ); desc t23; # auto_increment 自动递增 # 主键id作为数据标号,每次最好能自动增加 create table t24( id int primary key auto_increment, name varchar(16) ); insert into t24(name) values('x'),('y'),('z');
补充
delete from 表名; 该命令确实可以将表中的所有记录删掉,但不不会将id重置为0,所以该命令根本不是用来清空表的,delete是用来删除表中的某一条记录的 如: delete from 表名 where id > 10; truncate 表名; 该命令将整张表初始化,id重新从0开始记录