存储引擎:
不同类型的数据拥有不同的处理机制。
mysql存储引擎
Innodb:默认的存储引擎 查询速度较myisam慢 但是更安全
myisam:mysql老版本用的存储引擎,比较innodb
memory:内存引擎(数据全部存在内存中)
blackhole:无论存什么 都立马消失(黑洞)
研究一下每个存储引擎存取数据的特点
show engines;
数据类型
整型 浮点型 字符类型 日期类型 枚举与集合类型
约束
not null unique default primary key
t2:表结构,真实数据,索引
t4:只存在于内存中,所以没有真实数据。
t3是黑洞所以不会显示数据记录。
t4在重启服务端之后,因为存在于内存所以会消失。
创建表的完整语法
create table 表名(
字段名1 类型[(宽度) 约束条件],
字段名2 类型[(宽度) 约束条件],
字段名3 类型[(宽度) 约束条件]
);
注意:
1.字段名和字段类型是必须的 中括号内的参数都是可选参数
2.同一张表中字段名不能重复
3.最后一个字段后面不能加逗号
create table t6(
id int,
name char,#默认为:char(1)
);
宽度:
使用数据库的准则:能尽量让它少干活就尽量少干活(如果超了 mysql会自动帮你截取 )
对存储数据的限制
char(1) 只能存一个字符
如果超了 mysql会自动帮你截取
1.插入的时候 mysql自动截取
2.会直接报错(mysql严格模式)
修改字段为非空操作:
alter table t5 modify name char not null;
not null该字段不能插空
字段的数据类型:
字段类型
整型
SMALLINT TINYINT INT BIGINT
TINYINT
默认是否有符号 默认是带有符号的(-128,127)
超出限制时,超出之后只会存最大值或者最小值
字段约束:
not null 不能为空
unsigned 无正负符号
zerofill 0填充多余的位数
修改字段id数据类型为无符号整型:
char后面的数字是用来限制存储数据的长度的
特例:只有整型后面的数字不是用来限制存储数据的长度 而是用来控制展示的数据的位数
int(8) 够/超8位有几位就存几位,不够8位空格填充
也即:
强调:**对于整型来说,数据类型后的宽度并不是存储限制,
而是显示限制,所以在创建表时,
如果字段采用的是整型类型,完全无需指定显示宽度, 默认的显示宽度,足够显示完整当初存放的数据
只要是整型 都不需要指定宽度 因为有默认的宽度 足够显示对应的数据
修改约束条件 不够8位的情况下 用0填充(zerofill 0填充多余的位数)
查看严格模式:
模糊匹配
like
%匹配任意多个字符
_匹配任意一个字符
设置严格模式:
(数据库不会帮你做其他操作,比如数据类型超过范围不会帮你截取!)
set session 临时有效 只在你当前操作的窗口有效
set global 全局有效 终生有效
set global sql_mode = 'STRICT_TRANS_TABLES';
设置完之后 你只需要重新退出客户端再次进入即可
浮点型:
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
字符类型
char(4) # 最大只能存四个字符 超出来会直接报错 如果少了 会自动用空格填充
varchar(4) # 最大只能存四个字符 超出来会直接报错 如果少了 有几个存几个
char_length()
特殊机制:
mysql在存储char类型字段的时候 硬盘上确确实实存的是固定长度的数据
但是再取出来的那一瞬间 mysql会自动将填充的空格去除
可以通过严格模式 来修改该机制 让其不做自动去除处理
后面的模式来替换前面的模式。
char与varchar的区别
char定长
1.浪费空间
2.存取速度快
varchar变长
1.节省空间
2.存取速度慢(较于char比较慢)
存的时候 需要给数据讲一个记录长度的报头
取的时候 需要先读取报头才能读取真实数据
char(4) varchar(4)
取的时候方便 取的时候比较繁琐了 无法知道数据到底多长
直接按固定的长度取即可
日期类型
date #年月日
datetime #时分秒
year #年
time #时分秒
测试:
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');
枚举与集合类型
枚举(enum) 限制某个字段能够存储的数据内容
集合(set) 限制某个字段能够存储的数据内容
枚举:
集合set数据类型可以放多个值,但是需要用逗号隔开。
约束条件:
"""
PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录
FOREIGN KEY (FK) 标识该字段为该表的外键
NOT NULL 标识该字段不能为空
UNIQUE KEY (UK) 标识该字段的值是唯一的
AUTO_INCREMENT 标识该字段的值自动增长(整数类型,而且为主键)
DEFAULT 为该字段设置默认值
UNSIGNED 无符号
ZEROFILL 使用0填充
"""
往表中插入数据的时候 可以指定字段进行插入 不需要全部都插
insert into t17(name,id) values('egon',2);
create table student(
id int,
name char(16) not null,
gender enum('male','female','others') default 'male'
)
insert into student(id,name) values(1,'jason') # 成功
# 单列唯一
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);
# 单从约束角度来说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); # 除了约束之外,它还是innodb引擎组织数据的依据,提升查询效率 """ 强调: 1.一张表中必须有且只有一个主键,如果你没有设置主键,那么会从上到下搜索直到遇到一个非空且唯一的字段自动将其设置为主键 """ create table t12( id int, name char(16), age int not null unique, addr char(16) not null unique )engine=innodb; desc t12; """ 2.如果表里面没有指定任何的可以设置为主键的字段,那么innodb会采用自己默认的一个隐藏字段作为主键,隐藏意味着你在查询的时候无法根据这个主键字段加速查询了 索引:类似于书的目录,没有主键就相当于一页一页翻着查 3.一张表中通常都应该有一个id字段,并且通常将改id字段作成主键 """ # 联合主键:多个字段联合起来作为表的一个主键,本质还是一个主键 create table t18( ip char(16), port int, primary key(ip,port) ); desc t18; # 主键id作为数据的编号,每次最好能自动递增 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 仅仅是删除数据 不会重置主键
truncate 初始化表 会重置主键
约束条件not null 不能为空default 给某个字段设置默认值(当用户写了的时候用用户的,当用户没有写就用默认值)create table t17(id int,name char(16) default 'jason');
往表中插入数据的时候 可以指定字段进行插入 不需要全部都插
insert into t17(name,id) values('egon',2);
unique 唯一
单列唯一 限制某一个字段是唯一的
联合唯一(在语句的最后 用括号的形式 表示哪几个字段组合的结果是唯一的)
ip
port
create table server(
id int,
ip char(16),
port int,
unique(ip,port)
)
primary key 主键
限制效果跟 not null + unique 组合效果一致 非空且唯一
create table t18(id int primary key);
primary key也是innodb引擎查询必备的索引
索引你就把当成书的目录
innodb引擎在创建表的时候 必须要有一个主键
当你没有指定主键的时候
1.会将非空切唯一的字段自动升级成主键
2.当你的表中没有任何的约束条件 innodb会采用自己的内部默认的一个主键字段
该主键字段你在查询时候是无法使用的
查询数据的速度就会很慢
类似于一页一页的翻书
create table t19(
id int,
name char(16),
age int not null unique,
addr char(16) not null unique
);
主键字段到底设置给谁呢???
通常每张表里面都应该有一个id字段
并且应该将id设置为表的主键字段
联合主键:多个字段联合起来作为表的一个主键,本质还是一个主键!!!
!!!!!!!!!!!!!!!!!ps:innodb引擎中一张表有且只有一个主键!!!!!!!!!!!!!!!!!!!!!!!
create table t20(
ip char(16),
port int,
primary key(ip,port)
);
desc t20;
主键字段应该具备自动递增的特点
每次添加数据 不需要用户手动输入
auto_increment 自动递增
create table t21(id int primary key auto_increment,name varchar(16));
create table t22(id int primary key,name varchar(16));