Python 存储引擎 数据类型 主键

一 存储引擎

1.不同的数据应该有着不同的处理机制

2.常见的存储引擎和特点

#1.Inodb: mysql默认的存储引擎,查询速度比Myisam引擎较慢,但是更安全。

#2.Myisam: 老版本的mysql的存储引擎

#3.memory:内存引擎(数据全部存在内存中,服务端重启数据就不存在了)

#blackhole:无论存什么立马消失

3.查看数据库的所有引擎:show engines;

## 1.innodb 

 1.默认版本包含5.6

 2.支持事物操作使用

 3.不支持全文索引

 4.索引和数据都是在同一个文件中,.idb

## 2.MyIsam 

1.默认版本5.5以下

2.不支持事物操作

3.支持全文索引

\4. .frm 表的结构

​    .MYD 表数据

​    .MYI表索引

 

 

二 数据库中的数据类型

整型

1.分类:TINYINT SMALLINT MEDIUMINT INT BIGINT

2.作用:存储年龄,等级,id,各种号码等

3.注意:只有整型后面的数字不是用来限制存储数据的长度 而是用来控制展示的数据的位数:int(8) 够/超8位有几位存几位,不够8位空格填充。

create table t4(x int(8));
insert into t4 values(4294967296123);

# 显示时,不够8位用0填充,如果超出8位则正常显示
create table t5(x int(8) unsigned zerofill);
insert into t5 values(4294967296123);

# create table t6(id int(10) unsigned);
# create table t7(id int(11));
View Code

浮点型

1.分类:FLOAT DOUBLE decimal

2.应用场景:身高,体重,薪资,字段限制特点(5,3)前一位表示所有的位数,后一位表示小数个数

3.精确度:float < double < decimal

字符类型

作用:姓名,地址,描述类信息

1.char(定长):

特点:#1.存取速度快  #2.浪费空间

例:char(4) 安全模式下最大只能存四个字符 超出来会直接报错 如果少了 会自动用空格填充,严格模式下自动截取最多四个字符多除部分不存储。

 

mysql在存储char类型字段的时候 硬盘上确确实实存的是固定长度的数据
但是再取出来的那一瞬间 mysql会自动将填充的空格去除

2.varchar(变长)

特点:#1.节省空间  #2.存取速度较慢(较于char)

例:varchar(4) #安全模式下 最大只能存四个字符 超出来会直接报错 如果少了 有几个存几个,严格模式下:严格模式下自动截取最多四个字符多除部分不存储。

"""
char与varchar的使用区别
"""
name char(5)
# 缺点:浪费空间
# 优点:存取速度都快
egon alex lxx  jxx  txx  

name varchar(5)
# 缺点:存取速度慢
# 优点:节省空间
1bytes+egon 1bytes+alex 1bytes+lxx  1bytes+jxx  1bytes+txx 
View Code

严格模式补充

我们刚刚在上面设置了char,tinyint,存储数据时超过它们的最大存储长度,发现数据也能正常存储进去,只是mysql帮我们自动截取了最大长度。但在实际情况下,我们应该尽量减少数据库的操作,缓解数据库的压力,让它仅仅只管理数据即可,这样的情况下就需要设置严格模式

show variables like "%mode%";  # 查看数据库配置中变量名包含mode的配置参数
# 修改安全模式
set session # 只在当前操作界面有效
set global  # 全局有效

set global sql_mode ='STRICT_TRANS_TABLES'
# 修改完之后退出当前客户端重新登陆即可
View Code

时间类型

1.分类

  • date:2019-05-01   年 月 日

  • time:11:11:11         时 分 秒

  • Datetime: 2019-01-02 11:11:11  年 月 日  时 分 秒

  • Year:2019  年

枚举与集合类型

1.分类

  • 枚举enum 多选一

  • 集合set 多选多

create table user(
    id int,
  name char(16),
  gender enum('male','female','others')
);
insert into user values(1,'jason','xxx')  # 报错
insert into user values(2,'egon','female')  # 正确!


create table teacher(
    id int,
  name char(16),
  gender enum('male','female','others'),
  hobby set('read','sleep','sanna','dbj')
);
insert into teacher values(1,'egon','male','read,sleep,dbj')  # 集合也可以只存一个
View Code

三 约束条件

1. not null 不能为空
    default 给某个字段设置默认值(当用户写了的时候用用户的,当用户没有写就用默认值)

 

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')  # 成功
View Code

2.unique

# 单列唯一
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);
View Code
单列唯一   限制某一个字段是唯一的
联合唯一(在语句的最后 用括号的形式 表示哪几个字段组合的结果是唯一的,单个是可以重复的)

3.主键primary key 和 自增(递增)auto_increment

# 单从约束角度来说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的字段加
View Code

四 数据行的删除

delete from tb1;
强调:上面的这条命令确实可以将表里的所有记录都删掉,但不会将id重置为0,
所以收该条命令根本不是用来清空表的,delete是用来删除表中某一些符合条件的记录
delete from tb1 where id > 10;

如果要清空表,使用truncate tb1;
作用:将整张表重置,id重新从0开始记录
View Code

 

posted @ 2019-08-19 16:20  心慌得初夏  阅读(289)  评论(0编辑  收藏  举报
levels of contents