ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

MySQL存储引擎与基本数据类型

2022-02-18 21:02:02  阅读:236  来源: 互联网

标签:insert 存储 into MySQL 数据类型 values mysql table id


存储引擎

  数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。

  可以简单的理解为是处理同一数据的不同方式。

MySQL主要存储引擎

    MyISAM

  MySQL5.5之前的默认存储引擎,数据的存储速度较InnoDB更加快。

    InnoDB

  MySQL5.5之后的默认存储引擎,具有事务,行级锁,和外键的功能,数据的安全性更高,数据的存储速度较慢

    memory

  基于内存存储数据,速度最快,但是断电后会立刻丢失

    blackhole

  使用该引擎写入数据会立马消失,类似于垃圾处理站

 

 

 

不同引擎创建表的区别

# 创建不同的表
create table t1(id int) engine=myisam;
create table t2(id int) engine=innodb;
create table t3(id int) engine=memory;
create table t4(id int) engine=blackhole;
"""
MyISAM会创建三个文件
   .frm      表结构文件
   .MYD    表数据文件
   .MYI    表索引文件(索引是用来加快数据查询的)
InnoDB会创建两个文件
   .frm     表结构文件
   .ibd     表数据和表索引文件
memory
   .frm     表结构文件
blackhole
   .frm     表结构文件
"""

 

 

 

 

严格模式

# 针对MySQL5.6版本数据超出范围不会报错 而是自动帮你截取并保存(此行为不合理)
    方式1:修改配置文件(永久)
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES  方式2:命令修改(暂时) show variables like '%mode%' set session # 当前窗口有效 set global # 当前服务端有效 set gloabl sql_mode = 'strict_trans_tables' 修改完毕后退出客户端重新进入即可 再次执行上述插入命令 会直接报错

 

基本数据类型

整型

分类:tinyint,smallint,int,bigint

区别:不同的int类型能够储存的范围是是不一样的,bigint>int>smallint>tinyint

'''研究默认是否需要正负号'''
        create table t1(id tinyint);
        insert into t1 values(-999),(999);
 # 结论:所有的int类型默认都需要正负号
        create table t6(id tinyint unsigned);  # 移除正负号
        insert into t6 values(-999),(999);

整型中括号内数字的作用

id int(8)
    如果数字没有超出8位 那么默认用空格填充至8位
    如果数字超出了8位 那么有几位就存几位(但是还是要遵守最大范围)
"""
create table t13(id int(8) unsigned zerofill);
# 用0填充至8位

# 总结:
针对整型字段 括号内无需指定宽度 因为它默认的宽度以及足够显示所有的数据了

 

 

 

 

 

浮点型

分类:float,double,decimal

区别:三者的精确度不同,float<double<decimal

float(255,30)  # 总共255位 小数位占30位
double(255,30)  # 总共255位 小数位占30位
decimal(65,30)  # 总共65位 小数位占30位
"""研究三者的不同"""
create table t7(id float(255,30));
create table t8(id double(255,30));
create table t9(id decimal(65,30));
insert into t7 values(1.11111111111111111111111);
insert into t8 values(1.11111111111111111111111);
insert into t9 values(1.11111111111111111111111);

 

 

 

 

字符类型

  • char:定长类型,定义了多少字节的长度,在输入时超过这个长度便会报错,比这个长度少便会使用空格填充到定义的长度。

    优点:数据存取方便,速度快

    缺点:浪费了存储空间

  • varchar:变长类型,定义了多少字节的长度,在输入时超过这个长度便会报错,比这个长度少便有几个存几个。

    优点:节省了存储空间

    缺点:数据存取麻烦,需要有1bytes来先制作报头,然后获取报头再获取数据。

mysql> create table t1(name char(5));
mysql> create table t2(name varchar(5));
mysql> insert into t1 values('jjk');
mysql> insert into t2 values('jjk');
# char类型里的数据在取出时会自动消除空格 可以设置以下语句取消
 set global sql_mode = 'strict_trans_tables,pad_char_to_full_length'

给字段增加注释

# 增加注释
mysql> create table t2(id int comment '序号');
# 查看注释
mysql> show create table t3;

 

 

 

 

枚举与集合

  • 枚举:设置字段的时候有多个选项,只能从这个几个选项中选择一个

  • 集合:设置字段的时候有多个选项,可以选择一个或者多个

# 设置枚举
mysql> create table t1(gender enum('男','女'));
# 设置集合
mysql> create table t2(hobby set('篮球','足球','网球'));

# 给表中加入记录
mysql> insert into t1 value('男'); # 成功
mysql> insert into t1 value('女'); # 成功
mysql> insert into t1 value('man');# 报错

mysql> insert into t2 values('篮球,网球,足球'); # 成功
mysql> insert into t2 values('足球'); # 成功

 

 

 

 

时间类型

分类:

  • date:年月日

  • datatime:年月日时分秒

  • time:时分秒

  • year:年份

mysql> create table t1(time datetime);
mysql> insert into t1 values('2022-2-18 19:20:20');

 

 

 

 

 

创建表的完整语法

create table 表名(
    字段名1 字段类型(数字) 约束条件,
    字段名2 字段类型(数字) 约束条件,
    字段名3 字段类型(数字) 约束条件
);
"""
1.字段名和字段类型是必须的
2.数字和约束条件是可选的 并且 约束条件可以有多个空格隔开即可
3.最后一个语句的结尾不要加逗号
"""

 

 

 

 

约束条件

unsigned:让数字没有负数

mysql> create table t1(id int unsigned);
mysql> insert into t1 values(-100);  # 报错
mysql> insert into t1 values(100);

 

 

 

 zerofill:当字段类型是char时,输入的值小于设定的字节时,使多余的部分使用数字0填充

mysql> create table t2(name int zerofill);
mysql> select * from t2;

 

 

 

not null:非空,当表中的记录为空时就会报错

"""
    新增表数据的方式
        方式1:  按照字段顺序一一传值
             insert into t1 values(1,'jack');
        方式2:  自定义传值顺序 甚至不传
            insert into t1(name,id) values('jack',1);
            insert into t1(id) values(1);
    在MySQL中不传数据 会使用关键字NULL填充意思就是空 类似于python的None
"""

mysql> create table t3(id int, name char(6) not null );

mysql> insert into t3(id) values(2); # 报错
mysql> insert into t3(id,name) values(2,'jack'); #添加成功

 

default:设置默认值,如果没有输入则使用默认值,输入值就使用输入的值

mysql> create table t5(id int,name char(5),
gender enum('male','female') default 'male'); # 创建表

mysql> insert into t5(id,name) values(1,'xk'); # 添加记录

mysql> select * from t5; # 查看表记录

 

 

 

unique:唯一值,设置了该条件表中不能出现与该数据相同的数据

# 单列唯一
mysql> create table t6(id int unique); # 创建表
mysql> insert into t6 values(1);  # 添加成功
mysql> insert into t6 values(1);  # 报错


#联合唯一
mysql> create table t7(id int, name char(5),unique(id,name));
mysql> insert into t7 values(1,'abc'); # 添加成功
mysql> insert into t7 values(1,'asd'); # 添加成功
mysql> insert into t7 values(2,'asd'); # 添加成功
mysql> insert into t7 values(1,'abc'); # 报错

 

primary key:主键

  单从约束条件上来讲,主键的功能相当于not null + unique(非空且唯一),在此基础上还可以加快数据的查询

  InnoDB引擎规定了一张表有且只有一个主键

  如果在创建表的时候没有设置主键,InnoDB引擎会采用隐藏的字段称为主键,该情况不能加快数据的查询

  如果某个字段拥有非空且唯一的约束条件,并且从上至下是最上面的位置,那么该字段就会自动升级成主键

create table t6(
                    id int,
                    age int not null unique, # 该键会称为主键
                    pwd int not null unique
                );

  结论:我们在创建表的时候应该主动设置一个主键,一般情况都会将表的id字段设置为主键

 

auto_increment:自增

  在设置id字段的时候,一般都是以数字慢慢增加,该约束条件可以帮助我们不需要手动输入id值,系统会自动帮我们记录。

mysql> create table t8(id int primary key auto_increment,
 name varchar(32)); # 创建表

mysql> insert into t8(name) values('xk'),('xzj'),('jrm'); # 添加记录


mysql> select * from t8; # 查看表记录

 

 自增的特性

  自增不会因为删除操作而回退

# 删除记录
mysql> delete from t8 where id=1; 
mysql> delete from t8 where id=3;
# 添加记录
mysql> insert into t8(name) values('xk');
mysql> insert into t8(name) values('jrm');
# 查看记录
mysql> select * from t8;

 

 重置自增

  重置自增需要使用truncate关键字

# truncate 表名    清空表数据并且重置主键值
truncate t8;
查找记录
select * from t8; # Empty set (0.00 sec) 没有数据
# 添加记录
mysql> insert into t8(name) values('xk');

 

 

 

  

标签:insert,存储,into,MySQL,数据类型,values,mysql,table,id
来源: https://www.cnblogs.com/892572624A/p/15911230.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有