存储引擎
存储引擎就是如何存储数据,如何为存储数据建立索引和如何更新、查询数据等技术的实现方法,因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎可以称之为表类型(即存储与操作表的类型)
常见存储引擎:详情参考: https://www.cnblogs.com/linhaifeng/articles/7213670.html
1.innoDB存储引擎:支持事物,其设计目标主要面向联机事物处理的应用。
特点:行锁设计,支持外键,并支持类似oracle的非锁定读,即默认读取操作不会产生锁。
2.MyISAM存储引擎:不支持事物、表锁设计,支持全文索引。主要面向一些olap数。
3.NDB存储引擎:一个集群类型存储引擎。面向oltp数据库应用类型。
特点:高可用,高性能,高扩展性的数据库集群系统。
4.Memory存储引擎:数据都存放在内存中,数据库重启或崩溃,表中的数据会丢失。
5.Infobright存储引擎:是一个按列存储的第三方存储引擎。
6.NTSE存储引擎:网易内部开发使用的引擎。
7.BLACKHOLE:黑洞引擎,表中插入数据不会被记录。
使用存储引擎即在创建表时指定:
- create table t1(id int)engine=innodb;
- create table t2(id int)engine=myisam;
- create table t3(id int)engine=blackhole;
- create table t4(id int)engine=memory;
数据类型
建表的时候字段都有对应的数据类类型
整形
分类:tinyint , smallint, mediumint, int, bigint
应用场景:存储年龄、等级、id、各种号码等。。。
tinyint:默认由正负符号限制
create table t2(id TINYINT);#创建表t2时更改其类型默认有正负符号限制。
insert into t2 values(-129),(256);#插入数据默认最小-128,最大127多出的话以最大或最小值传入,最新版的则会报错不允许插入。
create table t3(number tinyint unsigned);#创建表t3时更改其类型默认无正负符号限制
insert into t3 values(-10); 插入数据为负值时新版会报错,旧版则为0
INT:默认最大展示的位数11位
create table t4(id int);#创建表t4更改id数据类型位int
insert into t4 values(-21474836483333),(2147483647333333);# 向太
表传入数据不管正负最多为11位切最大值2147483647最小值-2147483648,超过按最大值或最小值传入,新版会报错。
create table t5(id int(8));#int后跟数字并非限制显示数据的位数,而是8位以内由空格补全。超出则正常显示
create table t6(id int unsigned zerofill);#创建t6表数据类型位无正负号,插入数据不满以0填充
浮点型
分类:float,double,decimal
应用场景:身高,体重,薪资
三者区别:
注意:字段限制特点(5,3)前一位表示所有的位数,后一位表示小数个数。
存储限制:
float(255,30)
double(255,30)
decimal(65,30)
create table t7(id float(255,30));
create table t8(id double(255,30));
create table t9(id decimal(65,30));
字符类型char与varchar
char:定长
create table t10(name char(4)); #超过四个字符会报错,不够四个字符空格补全。
varchar:不定长
ceate table t11(name varchar(4)); #超过四个报错,不足四个有几个存几个
char 与 varchar的比较
char:
1.浪费空间
2.存取速度快
比如:char(6):tank,jason,sean都是6个字符
varvhar:
1.节省空间
2.存取速度慢
比如:varchar(6):1bytes+ tank ,1bytes + jason #1+ 表示的1是用来存长度的
日期类型
分类:
date:2019-12-11
time:18:08:08
datetime:2019-12-11 18:08:08
year:2019
createtableteacher(id int,name varchar(16),bor_years year,work_time time,register_time datetime);
insert into teacher values(1,'tank','2019','2019-12-11','18:08:08','2019-12-11 18:08:08');
枚举与集合
分类:
枚举enum多选一
集合set多选一或多选多
枚举:
create table user(id int,name varchar(16),grent enum('male','female','others'));
insert into user1 vsalues(1,'sean','male'); #参数必须在表中
集合:
create table user2(id int,name varchar(16),grent enum('male','female','others'),hobbies set('read','sleep','play ball','run'));
#多选一
insert into user2 values(1,'tank','male','read');
#多选多
insert into useR2 values(2,'jason','female','read,sleep');#read,sleep必须连着写
select * from user2;
+------+-------+--------+------------+
| id | name | grent | hobbies |
+------+-------+--------+------------+
| 2 | jason | female | read,sleep |
+------+-------+--------+------------+
约束条件
约束条件就是对于数据库表插入数据时加以约束
primary key(PK)
create table user7(id int primary key); insert into user7 values(1); #primary key 除了约束之外,还是innodb引擎组织数据的语句,提升查询效率 #一张表必须要有一个主键,如果没有设置主键,会从上向下搜索,知道遇见第一个不为空的且唯一的字段自动设置为主键 create table user8(id int,name varchar(16),age int not null unique)engine = innodb; #如果包里没有指定任何可以设置主键的字段,那innodb会采用自己默认的一个隐藏关键字作为主键,隐藏意味着查询你的时候通过这个加速查询。 #一张表中通常都应该有一个id字段,并且通常将id字段作为主键 #联合主键:多个字段联合起来作为一个主键,本质上还是一个主键。 create user9(id int, name varchar(16),primary key(id,name)); desc user9; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | 0 | | | name | varchar(16) | NO | PRI | | | +-------+-------------+------+-----+---------+-------+
标识该字段为该表的主键,主键可以是唯一的表示记录
foreign key(fk)
标识该字段为该表的外键
unique key(UK)
标识字段的值唯一
not null
标识字段不能为空
default
为该字段设置默认值
auto_increment
标识该字段的值自动增长(整理类型,并为主键)
create table user10(id int primary key auto_increment, name varchar(16)); insert into user10(name) values('tank'); select * from user10; +----+------+ | id | name | +----+------+ | 1 | tank | +----+------+ #如果想自增从指定值开始,可插入第一条数据时先之低昂id值 insert into user10(id,name)values(10,'tank'); insert into user10(name)values('jak'); insert into user10(name)values('tom'); select * from user10; +----+------+ | id | name | +----+------+ | 1 | tank | | 10 | tank | | 11 | jak | | 12 | tom | +----+------+ #注意:auto_increment通常加载在主键上,并且只能设置给primary key字段 delete from user10; #delete删除表记录或者指定记录,但id不会重置为0 delete from user10 where id ='12'; insert into user10(name)values('jaks'); select * from user10; +----+------+ | id | name | +----+------+ | 1 | tank | | 10 | tank | | 11 | jak | | 13 | jaks | +----+------+ #要想清空id可使用trunca user10; truncate user10;
zerofill
使0填充空格
设置严格模式:
# 查看数据库配置中变量名包含mode的配置参数: show variables like "%mode%"; # 修改安全模式: set session; # 局部有效,只在你当前操作的窗口有效 set global session; # 全局有效,永久有效 # 修改完之后退出当前客户端重新登录即可 set global sql_mode = 'STRICT_TRANS_TABLES';