不同的数据应该有不同的处理机制
MySQL存储引擎
Innodb
5.1版本之后默认的存储引擎,查询速度较myisam慢,但是更安全
建表的时候innodb会产生两个文件
一个是表结构文件
一个是存储数据文件
myisam
5.1版本之前的MySQL的默认存储引擎
查询速度较于innodb要快
建表的时候会产生三个文件
一个是表结构文件
一个是索引文件
索引你先把它理解成是书的目录,能够帮你更快的查询数据
一个是存储数据文件
memory
内存引擎(数据全部存在内存中)
建表的时候只有一个表结构文件
blackhole
任何写入的数据都会消失
建表的时候只有一个表结构文件
创建表的完整语法
create table 表名(
字段名1 字段类型[(宽度) 约束条件],
字段名2 字段类型[(宽度) 约束条件],
字段名3 字段类型[(宽度) 约束条件]
)
注意:
1.同一张表内字段名不能重复
2.字段名和字段类型都是必须的,中括号内的都是可选的
3.最后一个字段语句后不能有逗号
宽度
使用数据库的准则:能尽量让它少干活就尽量少干活
对存储数据的限制
char(1) 只能存一个字符
如果超了 mysql会自动帮你截取
1.插入的时候 mysql自动截取
2.会直接报错(mysql严格模式)
alter table test modify name char not null;
not null该字段不能插空
字段类型和约束条件
字段类型约束的是存储数据的类型
约束条件是基于字段类型之上的额外约束
字段类型
整型
smallint tinyint int bigint
默认都是带正负号
tinyint 1bytes
int 4bytes
int(8):数字不够8位,默认用空格填充,够8位或者8位以上,有多少位显示多少位,但是不能超出int最大范围
注意:只有整型比较特殊,括号内的数字不是用来限制存储宽度,而是用来限制显示宽度
在定义整型字段的时候不需要指定宽度,默认就是展示最大宽度
tinyint
默认是否有符号 默认是带有符号的(-128,127)
超出限制会如何 超出之后只会存在最大值或者最小值
zerofill 用0填充不足的位数
not null 不能为空
unsigned 无正负符号
模糊匹配
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位
精确度:float < double < decimal
通常情况下会将数字在数据库存储上编程字符串来方便存储,不需要考虑精确度带来的问题
字符类型
char(4) 定长:最大存储四个字符,超出报错,不足默认用空格占位
varchar(4) 变长:最大存储四个字符,超出报错,不足有几个存几个
char vs varchar
char(django中如果你想用char需要你自己定义)
存取速度快
浪费硬盘空间
varchar(django默认只有varchar类型)
存取速度慢(相对于char慢一点)
存的时候,需要给数据加一个记录长度的报头
取的时候,需要先读取报头才能读取真是数据
节省硬盘空间
日期类型
date
datetime
year
time
枚举和集合类型
枚举(enum) 限制某个字段能够存储的数据内容
多选一(男女性别...)
集合(set) 限制某个字段能够存储的数据内容
多选多但是也可以多选一(爱好...)
如果写的信息不在选择范围内会直接报错
约束条件
not null 非空
default 默认值
gender enum(‘male‘,‘female‘,‘others‘) default ‘male‘
unique 唯一:不能出现重复
单例唯一:在同一张表中某个字段的信息不能重复
id int unique
联合唯一(在语句的最后,用括号的形式,表示哪几个字段组合的结果是唯一的)
ip
port
create table server(
id int,
ip char(16),
port int,
unique(ip,port)
);
primary key 主键
限制效果跟 not null + unique 组合效果一致(非空且唯一)
create table test(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));
delete from 仅仅是删除数据,不会重置主键
truncate 初始化表,会重置主键
原文:https://www.cnblogs.com/TZZ1995/p/11385243.html