数据库(存储引擎、字段类型、约束条件)
一、存储引擎
现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制:比如处理文本用txt类型,处理表格用excel,处理图片用png等
数据库中的表也应该有不同的类型,表的类型不同,会对应mysql不同的存取机制,表类型又称为存储引擎。
mysql存储引擎类型
show engines; # 查看所有支持的存储引擎
InnoDB 存储引擎
支持事务,其设计目标主要面向联机事务处理(OLTP)的应用。其特点是行锁设计、支持外键,并支持类似 Oracle 的非锁定读,即默认读取操作不会产生锁
MyISAM 存储引擎
不支持事务、表锁设计、支持全文索引,主要面向一些 OLAP 数 据库应用,在 MySQL 5.5.8 版本之前是默认的存储引擎
Memory 存储引擎
Memory 存储引擎中的数据都存放在内存中,数据库重 启或发生崩溃,表中的数据都将消失
BLACKHOLE
黑洞存储引擎,可以应用于主备复制中的分发主库。
创建四个表,分别使用innodb,myisam,memory,blackhole存储引擎
1 create table t1(id int)engine=innodb; 2 create table t2(id int)engine=myisam; 3 create table t3(id int)engine=memory; 4 create table t4(id int)engine=blackhole;
发现后两种存储引擎只有表结构,无数据,
memory,在重启mysql或者重启机器后,表内数据清空
blackhole,往表内插入任何数据,都相当于丢入黑洞,表内永远不存记录
二、字段类型
1.数值类型
整数类型:
tinyint(n):小整数,数据类型用于保存一些范围的整数数值范围
有符号:-128 ~ 127
无符号:0 ~ 255
int(n):整数
有符号: -2147483648 ~ 2147483647
无符号:0 ~ 4294967295
bigint(n):大整数
为该类型指定宽度时,仅仅只是指定查询结果的显示宽度,与存储范围无关,其实我们完全没必要为整数类型指定显示宽度,使用默认的就可以了
浮点类型:
float(m,d):单精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数
m最大值为255,d最大值为30
随着小数的增多,精度变得不准确
double(m,d):双精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数
m最大值为255,d最大值为30
随着小数的增多,精度比float要高,但也会变得不准确
decimal(m,d):准确的小数值,m是数字总个数,d是小数点后个数
m最大值为65,d最大值为30
随着小数的增多,精度始终准确
2.字符串类型
char类型:
定长,简单粗暴,浪费空间,存取速度快
存储:存储char类型的值时,会往右填充空格来满足长度
指定长度为10,存>10个字符则报错,存<10个字符则用空格填充直到凑够10个字符存储
varchar类型:
变长,精准,节省空间,存取速度慢
存储:varchar类型存储数据的真实内容,不会用空格填充
varchar类型会在真实数据前加1-2Bytes的前缀,该前缀用来表示真实数据的bytes字节数
3.日期类型
year:YYYY(2019)
data:YYYY-MM-DD(2019-12-11)
time:HH:MM:SS(15:06:32)
datetime:YYYY-MM-DD HH:MM:SS(2019-12-11 15:06:32)
timestamp:时间戳
注意:单独插入时间时,需要以字符串的形式,按照对应的格式插入
4.枚举与集合
字段的值只能在给定范围中选择,如单选框,多选框
枚举enum:
单选 只能在给定的范围内选一个值,如性别 sex 男male/女female
集合set:
多选 在给定的范围内可以选择一个或一个以上的值(爱好1,爱好2,爱好3...)
三、约束条件
约束条件与数据类型的宽度一样,都是可选参数
作用:用于保证数据的完整性和一致性
1.not null与default
not null表示非空,default后面加默认值
1 create table tb1( 2 nid int not null defalut 2, 3 num int not null 4 ); 5 # nid非空,如果为空,添加默认值2
2.unique:唯一约束条件
============设置唯一约束 UNIQUE=============== 方法一: create table department1( id int, name varchar(20) unique, comment varchar(100) ); 方法二: create table department2( id int, name varchar(20), comment varchar(100), constraint uk_name unique(name) );
联合唯一:两个字段合起来唯一,单独一个可以重复
1 create table service( 2 id int primary key auto_increment, 3 name varchar(20), 4 host varchar(15) not null, 5 port int not null, 6 unique(host,port) #联合唯一 7 );
3.主键primary key
从约束角度看primary key字段的值不为空且唯一
主键primary key是innodb存储引擎组织数据的依据,innodb称之为索引组织表,一张表中必须有且只有一个主键。
单列做主键
1 ============单列做主键=============== 2 #方法一:not null+unique 3 create table department1( 4 id int not null unique, #主键 5 name varchar(20) not null unique, 6 comment varchar(100) 7 ); 8 9 #方法二:在某一个字段后用primary key 10 create table department2( 11 id int primary key, #主键 12 name varchar(20), 13 comment varchar(100) 14 ); 15 16 #方法三:在所有字段后单独定义primary key 17 create table department3( 18 id int, 19 name varchar(20), 20 comment varchar(100), 21 constraint pk_name primary key(id); #创建主键并为其命名pk_name
多列做主键(复合主键)
1 ==================多列做主键================ 2 create table service( 3 ip varchar(15), 4 port char(5), 5 service_name varchar(10) not null, 6 primary key(ip,port) 7 );
4.自动增长auto_increment
约束字段为自动增长,被约束的字段必须同时被key约束
#不指定id,则自动增长 create table student( id int primary key auto_increment, name varchar(20), sex enum('male','female') default 'male' );
不指定id,则自动增长
自增默认从0开始,若想自增从指定值开始,可插入第一条数据时先指定id的值
对于自增的字段,在用delete删除后,再插入值,该字段仍按照删除前的位置继续增长