存储引擎,MySQL中的数据类型及约束

一、存储引擎

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

2、mysql存储引擎

​ Innodb:默认的存储引擎,查询速度叫myisam慢,但是更安全

​ 支持事务,行锁,外键,所以数据更安全

​ 建表的时候Innodb会产生两个文件

​ 一个是表结构文件

​ 一个是存储数据文件

​ myisam:mysql老版本(5.1版本之前)用的存储引擎

​ 查询速度较于Innodb要快

​ 会产生三个文件:表结构文件,索引文件(可以理解为是书的目录,能帮助你更快的查询数据),存储数据文件

​ memory:内存引擎(数据全部存在内存中)

​ 建表的时候仅仅只有一个表结构文件

​ blackhole:无论存什么,都立马消失(黑洞)

​ 建表的时候仅仅只有一个表结构文件

数据库的增删改查已经介绍完毕,今天从表的详细操作开始讲解

二、创建表的完整语法

  1. #语法:
  2. create table 表名(
  3. 字段名1 类型[(宽度) 约束条件],
  4. 字段名2 类型[(宽度) 约束条件],
  5. 字段名3 类型[(宽度) 约束条件]
  6. );
  7. #注意:
  8. 1. 在同一张表中,字段名不能相同
  9. 2. 宽度和约束条件可选,字段名和类型是必须的
  10. 3. 最后一个字段后不能加逗号!
  11. # 补充:
  12. # 1.宽度指的是对存储数据的限制
  13. create table userinfo(name char);
  14. insert into userinfo values('jason');
  15. """
  16. 1.没有安全模式的数据库版本,能够存放数据但是只会存进去一个j
  17. 2.最新数据库版本直接报错提示无法存储:Data too long for column 'name' at row 1
  18. """
  19. # 2.约束条件初识>>> null 与 nut null
  20. create table t1(id int,name char not null);
  21. insert into t1 values(1,'j'); # 正常存储
  22. insert into t1 values(2,null); # 报错
  23. # 总结 类型与约束条件区别
  24. # 类型:限制字段必须以什么样的数据类型存储
  25. # 约束条件:约束条件是在类型之外添加一种额外的限制

三、基本数据类型

整型

  • 分类:TINYINT SMALLINT MEDIUMINT INT BIGINT
  • 默认都是带正负号,tinyint 占1bytes,int占4bytes
  • 在定义整型字段的时候不需要指定宽度,默认就是展示最大宽度
  • 作用:存储年龄,等级,id,各种号码等

类型存储范围:参考图片http://www.cnblogs.com/linhaifeng/articles/7233411.html

验证整型字段有无符号及范围

  1. create table t1(x tinyint);
  2. insert into t1 values(128),(-129);
  3. create table t2(x tinyint unsigned);
  4. insert into t2 values(-1),(256);
  5. create table t3(x int unsigned);
  6. insert into t3 values(4294967296);

疑问:类型后面的宽度能否改变字段存储的大小限制

  1. create table t4(x int(8));
  2. insert into t4 values(4294967296123);
  3. # 显示时,不够8位用0填充,如果超出8位则正常显示
  4. create table t5(x int(8) unsigned zerofill);
  5. insert into t5 values(4294967296123);
  6. # create table t6(id int(10) unsigned);
  7. # create table t7(id int(11));

强调:对于整型来说,数据类型后的宽度并不是存储限制,而是显示限制,所以在创建表时,如果字段采用的是整型类型,完全无需指定显示宽度, 默认的显示宽度,足够显示完整当初存放的数据

严格模式补充

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

  1. show variables like "%mode%"; # 查看数据库配置中变量名包含mode的配置参数
  2. # 修改安全模式
  3. set session # 只在当前操作界面有效
  4. set global # 全局有效
  5. set global sql_mode ='STRICT_TRANS_TABLES'
  6. # 修改完之后退出当前客户端重新登陆即可

浮点型

  • 分类:FLOAT DOUBLE decimal
  • 应用场景:身高,体重,薪资

字段限制特点(5,3)前一位表示所有的位数,后一位表示小数个数

三者最大整数位和小数位对比:

  1. # 存储限制
  2. float(255,30) 总共255位,小数占30
  3. double(255,30) 总共255位,小数占30
  4. decimal(65,30) 总共6 5位,小数占30
  5. # 精确度验证
  6. create table t9(x float(255,30));
  7. create table t10(x double(255,30));
  8. create table t11(x decimal(65,30));
  9. insert into t9 values(1.111111111111111111111111111111);
  10. insert into t10 values(1.111111111111111111111111111111);
  11. insert into t11 values(1.111111111111111111111111111111);

字符类型

  • 分类

    • char(定长)

      • 存取速度快
      • 浪费硬盘空间
    • varchar(变长)(Django默认使用varchar类型)
      • 存取速度慢(相对于char)
      • 节省硬盘空间
  • 作用:姓名,地址,描述类信息
  1. create table t10(name char(4)) # 超出四个字符报错,不够四个字符空格补全
  2. create table t11(name varchar(4)) # 超出四个字符报错,不够四个有几个就存几个
  3. # 验证存储限制
  4. insert into t12 values('hello');
  5. insert into t13 values('hello');
  6. # 验证存储长度
  7. insert into t12 values('a'); #'a '
  8. insert into t13 values('a'); #'a'
  9. select * from t12
  10. select * from t13 # 无法查看真正的结果
  11. select char_length(name) from t12
  12. select char_length(name) from t13 # 仍然无法查看到真正的结果
  13. """首先应该肯定的是在硬盘上存的绝对是真正的数据,但显示的时候mysql会自动将末尾的空格取掉"""
  14. # 如果不想让mysql帮你做自动去除末尾空格的操作,需要再添加一个模式
  15. set global sql_mode="strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH";
  16. # 退出客户端重新登陆
  17. select char_length(x) from t12; #4
  18. select char_length(y) from t13; #1
  19. # 针对char类型,mysql在存储时会将数据用空格补全存放到硬盘中。但是会在读出结果的时候自动取掉末尾的空格
  20. """
  21. char与varchar的使用区别
  22. """
  23. name char(5)
  24. # 缺点:浪费空间
  25. # 优点:存取速度都快
  26. egon alex lxx jxx txx
  27. name varchar(5)
  28. # 缺点:存取速度慢
  29. # 优点:节省空间
  30. 1bytes+egon 1bytes+alex 1bytes+lxx 1bytes+jxx 1bytes+txx

时间类型

  • 分类

    • date:2019-05-01
    • time:11:11:11
    • Datetime: 2019-01-02 11:11:11
    • Year:2019
  • 测试

    1. create table student(
    2. id int,
    3. name char(16),
    4. born_year year,
    5. birth date,
    6. study_time time,
    7. reg_time datetime
    8. );
    9. insert into student values(1,'egon','2019','2019-05-09','11:11:00','2019-11-11 11:11:11');

枚举与集合类型

  • 分类

    • 枚举enum 多选一
    • 集合set 多选多
  • 测试

    1. create table user(
    2. id int,
    3. name char(16),
    4. gender enum('male','female','others')
    5. );
    6. insert into user values(1,'jason','xxx') # 报错
    7. insert into user values(2,'egon','female') # 正确!
    8. create table teacher(
    9. id int,
    10. name char(16),
    11. gender enum('male','female','others'),
    12. hobby set('read','sleep','sanna','dbj')
    13. );
    14. insert into teacher values(1,'egon','male','read,sleep,dbj') # 集合也可以只存一个

四、约束条件

  1. """
  2. PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录
  3. FOREIGN KEY (FK) 标识该字段为该表的外键
  4. NOT NULL 标识该字段不能为空
  5. UNIQUE KEY (UK) 标识该字段的值是唯一的
  6. AUTO_INCREMENT 标识该字段的值自动增长(整数类型,而且为主键)
  7. DEFAULT 为该字段设置默认值
  8. UNSIGNED 无符号
  9. ZEROFILL 使用0填充
  10. """

not null+default

  1. create table user(
  2. id int,
  3. name char(16)
  4. );
  5. insert into user values(1,null) # 可以修改
  6. alter table user modify name char(16) not null;
  7. insert into user(name,id) values(null,2); # 报错 插入数据可以在表名后面指定插入数据对应的字段
  8. create table student(
  9. id int,
  10. name char(16) not null,
  11. gender enum('male','female','others') default 'male'
  12. )
  13. insert into student(id,name) values(1,'jason') # 成功

unique

  1. # 单列唯一
  2. create table user1(
  3. id int unique,
  4. name char(16)
  5. );
  6. insert into user1 values(1,'jason'),(1,'egon') # 报错
  7. insert into user1 values(1,'jason'),(2,'egon') # 成功
  8. # 联合唯一
  9. create table server(
  10. id int,
  11. ip char(16),
  12. port int,
  13. unique(ip,port)
  14. )
  15. insert into server values(1,'127.0.0.1',8080);
  16. insert into server values(2,'127.0.0.1',8080); # 报错
  17. insert into server values(1,'127.0.0.1',8081);

primary key+auto_increment

  1. # 单从约束角度来说primary key就等价于not null unique
  2. create table t11(id int primary key);
  3. desc t11;
  4. insert into t11 values(1),(1); # 报错
  5. insert into t11 values(1),(2);
  6. # 除了约束之外,它还是innodb引擎组织数据的依据,提升查询效率
  7. """
  8. 强调:
  9. 1.一张表中必须有且只有一个主键,如果你没有设置主键,那么会从上到下搜索直到遇到一个非空且唯一的字段自动将其设置为主键
  10. """
  11. create table t12(
  12. id int,
  13. name char(16),
  14. age int not null unique,
  15. addr char(16) not null unique
  16. )engine=innodb;
  17. desc t12;
  18. """
  19. 2.如果表里面没有指定任何的可以设置为主键的字段,那么innodb会采用自己默认的一个隐藏字段作为主键,隐藏意味着你在查询的时候无法根据这个主键字段加速查询了
  20. 索引:类似于书的目录,没有主键就相当于一页一页翻着查
  21. 3.一张表中通常都应该有一个id字段,并且通常将改id字段作成主键
  22. """
  23. # 联合主键:多个字段联合起来作为表的一个主键,本质还是一个主键
  24. create table t18(
  25. ip char(16),
  26. port int,
  27. primary key(ip,port)
  28. );
  29. desc t18;
  30. # 主键id作为数据的编号,每次最好能自动递增
  31. create table t13(
  32. id int primary key auto_increment,
  33. name char(16)
  34. );
  35. insert into t13('jason'),('jason'),('jason'); # id字段自动从1开始递增
  36. # 注意:auto_increment通常都是加在主键上,并且只能给设置为key的字段加

补充:

  1. delete from tb1;
  2. 强调:上面的这条命令确实可以将表里的所有记录都删掉,但不会将id重置为0
  3. 所以收该条命令根本不是用来清空表的,delete是用来删除表中某一些符合条件的记录
  4. delete from tb1 where id > 10;
  5. 如果要清空表,使用truncate tb1
  6. 作用:将整张表重置,id重新从0开始记录

存储引擎,MySQL中的数据类型及约束的更多相关文章

  1. 存储引擎和表的操作(mysql中的数据类型、完整性约束)

    一.存储引擎 .概念 MySQL中的数据用各种不同的技术存储在文件(或者内存)中.这些技术中的每一种技术都使用不同的存储机制.索引技巧.锁定水平并且最终提供广泛的不同的功能和能力. 通过选择不同的技术 ...

  2. MySQL中的数据类型及创建

    MySQL创建: 1.创建数据库create database test2; 2.删除数据库drop database test2;3.创建表create table ceshi(    ids in ...

  3. 【个人笔记】《知了堂》MySQL中的数据类型

    MySQL中的数据类型 1.整型 MySQL数据类型 含义(有符号) tinyint(m) 1个字节  范围(-128~127) smallint(m) 2个字节  范围(-32768~32767) ...

  4. MySQL中各种数据类型的长度及在开发中如何选择

    接触MySQL这个数据库大概快要两年了,不过由于没有特别深入系统的去学习,大多也是停留在一知半解的状态.今天在工作中刚好碰到了表设计的问题,顺便写篇博客,把MySQL中数据类型和字段类型选择这方面给弄 ...

  5. Sql Server中的数据类型和Mysql中的数据类型的对应关系(转)

    Sql Server中的数据类型和Mysql中的数据类型的对应关系(转):https://blog.csdn.net/lilong329329/article/details/78899477 一.S ...

  6. MySQL中的数据类型 [数值型、字符串型、时间日期型]

    MySQL中的数据类型 [数值型.字符串型.时间日期型] MySQL中各数据类型 1. 数值类型(整型) 类型 数据大小 类型 (无符号:unsigned) 数据大小 存储空间 tinyint -12 ...

  7. 抛砖系列之-MySQL中的数据类型JSON

    今天介绍一个MySQL中的数据类型-JSON,相信大家对JSON都不陌生,在日常工作中使用到的频率也很高,话不多说,直接开始. 何谓JSON 看下RFC文档对于JSON的描述 1.基于 JavaScr ...

  8. SET FOREIGN_KEY_CHECKS=0;在Mysql中取消外键约束。

    SET FOREIGN_KEY_CHECKS=0;在Mysql中取消外键约束.

  9. hive的本地安装部署,元数据存储到mysql中

    要想使用Hive先要有hadoop集群的支持,使用本地把元数据存储在mysql中. mysql要可以远程连接: 可以设置user表,把localhost改为%,所有可连接.记住删除root其他用户,不 ...

随机推荐

  1. php对数组排序 关联数组功能比较

    用php在国家统计局中抓取 省市区县 代码.名称.排序order id,处理方式是通过curl请求网址,正则匹配 获取信息,并保存为json文件,以便后期读取文件. 过程中或遇到对json文件转化为数 ...

  2. layer iframe 设置关闭按钮 和刷新

    layer.open({ type: 2, title: 'XXXX网吧历史更多数据', shade:0, // closeBtn:0, resize:false, move:false, shade ...

  3. Vue开发重点基础知识

    1.Vuejs组件 vuejs构建组件使用 Vue.component('componentName',{ /*component*/ }): 这里注意一点,组件要先注册再使用,也就是说: Vue.c ...

  4. Install macOS High Sierra on Any Supported Intel-based PC

    1.准备制作安装盘前的准备https://www.tonymacx86.com/threads/unibeast-install-macos-high-sierra-on-any-supported- ...

  5. 【算法学习记录-排序题】【PAT A1062】Talent and Virtue

    About 900 years ago, a Chinese philosopher Sima Guang wrote a history book in which he talked about ...

  6. OpenCV之Core组件进阶

    颜色空间缩减 利用C++类型转换时向下取整操作,实现定义域内颜色缩减.表达式如下 Inew = (Iold/10)*10 简单的颜色空间缩减算法可由以下两步组成: (1)遍历图像矩阵的每个元素 (2) ...

  7. Java常量,变量,对象(字面量)在JVM内存中的存储位置

    Java常量,变量,对象(字面量)在JVM内存中的存储位置 2019-02-26 18:13:09 HD243608836 阅读数 540  收藏 更多 分类专栏: JAVA jvm   苦苦研究了快 ...

  8. BZOJ1015[JSOI2008]星球大战starwar题解报告

    题目链接 考虑正序去除点去掉其所有连边十分复杂,可以倒序离线处理,每次新建一个点,连接其连边,用并查集统计联通块的个数. 附代码 #include<iostream> #include&l ...

  9. selenium-JavaScript的处理

    JavaScript的处理 在自动化过程中,遇到js处理的元素,需要使用js语言对元素进行操作,例如,滑动到浏览器的底部或者顶部,时间控件的处理,元素可见不可见以及富文本的处理等,都需要js语言的支持 ...

  10. HTML学习(10)图像

    HTML图像标签<img>,没有闭合标签 <img src="" alt="" width="" height=" ...