zoukankan      html  css  js  c++  java
  • MySQL之存储引擎,数据类型,约束条件

    ---恢复内容开始---

    存储引擎:

    不同的数据应该有不同的存储机制

    Innodb:mysql 5.5含5.5版本以上使用,现在我们使用的默认都是innodb,其特点是支持事务,支持行锁,支持外键,但不支持全文索引,所以说优点是:存储数据安全性高,缺点查询速度慢

    myisam:5.5版本一下使用的老版本引擎,支持全文索引,不支持事务,所以优点:查询速度快,缺点:安全性低

    memory:内存引擎,是为暂时性存储数据的引擎,因为数据全部是存在内存中的,所以一旦mysql服务端重新启动,会先将内存中的数据清空。

    blackhole:黑洞引擎,存什么都立马消失。

    四个存储引擎存储数据创建的文件:

    innodb:后缀为.frm的为表的结构,.ibd为表的数据

    myisam:后缀为.frm为表的结构,.MYD为表的数据,.MYI为索引

    memory:后缀为.frm为表的结构

    blackhole:后缀为.frm为表的结构。

    创建表的完整语法:
    create table 表名(字段名1,类型[(宽度),(约束条件)],

    字段名2,类型[(宽度),(约束条件)],

    字段名3,类型[(宽度),(约束条件)]);

    注意:

    在同一张表中,字段名不能重复,宽度和约束条件不是必须的,但字段名和类型则是必须。最后一个字段后不能加逗号。

     宽度指的是对存储数据长度的控制,但整型的宽度不是对存储的控制,而是对显示位数的控制。

    基本数据类型:

    整型:

    分类:TINYINT SMALLINT MEDIUMINT INT BIGINT

    TINYINT :

      默认是带有符号的(-128,127),超出限制只会存储最大值或最小值。

    再次强调:对于整型来说,数据类型后面跟着的宽度并不是控制存储的,而是控制显示位数的,所以在建表的时候,如果字段是整型,那么无需指定显示宽度,因为会有一个默认值,足够完整显示当初存放的数据。

    浮点型:
    float(255,30):总共255位,小数占30位

    double(255,30):总共255位,小数占30位

    decimal(65,30):总共65位,小数占30位

     区别:精确度不同

    float<double<decimal

    字符类型:

    char(定长):

    char(4):最多只能存4个,如果存的多了,不是安全模式下,会只存储允许的最大字符,导致数据不完整,安全模式下报错。如果存的少了会填充空格,就是固定了长度。

    varchar(变长):

    varchar(4):

    最多只能存4个,如果存的多了,不是安全模式下,会只存储允许的最大字符,导致数据不完整,安全模式下报错。如果存的少了,存多少那么就还是会存多少。

    安全模式设置:

    show variables like "%mode%";匹配数据库配置变量名中包含mode的配置参数。

    like通配符:

    %匹配多个任意字符,_匹配任意一个字符

    set session 临时模式,只在当前窗口有效

    set global sql_mode = 'STRICT_TRANS_TABLES'

    修改完后退出客户端重新进入就可以了,就是安全模式。

    char和varchar的不同之处:

    char是固定长度存储,所以取的时候按照固定长度存取就可以了,所以存取速度快,但是浪费空间,因为不满会以空格填充,varchar在存储的时候会带一个数据长度的报头,在取的时候按这个报头的长度取好了,所以存取速度慢,但节省资源,现在通常是varchar,因为能减少数据库的压力尽量减少。

    reate table t10(name char(4))  # 超出四个字符报错,不够四个字符空格补全
    create table t11(name varchar(4))  # 超出四个字符报错,不够四个有几个就存几个
    
    # 验证存储限制
    insert into t12 values('hello');
    insert into t13 values('hello');
    # 验证存储长度
    insert into t12 values('a'); #'a    '
    insert into t13 values('a'); #'a'
    select * from t12
    select * from t13  # 无法查看真正的结果
    
    select char_length(name) from t12
    select char_length(name) from t13  # 仍然无法查看到真正的结果
    
    """首先应该肯定的是在硬盘上存的绝对是真正的数据,但显示的时候mysql会自动将末尾的空格取掉"""
    # 如果不想让mysql帮你做自动去除末尾空格的操作,需要再添加一个模式
    set global sql_mode="strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH";
    # 退出客户端重新登陆
    select char_length(x) from t12; #4
    select char_length(y) from t13; #1
    
    # 针对char类型,mysql在存储时会将数据用空格补全存放到硬盘中。但是会在读出结果的时候自动取掉末尾的空格
    View Code

    时间类型:

     date:年月日

    datetime:年月日,时分秒

    year:年

    time:时分秒

    create table student(
        id int,
      name char(16),
      born_year year,
      birth date,
      study_time time,
      reg_time datetime
    );
    insert into student values(1,'egon','2019','2019-05-09','11:11:00','2019-11-11 11:11:11');

    枚举 和集合:
    枚举:多选一enum

    集合:多选多。

    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 Cod

    约束条件:

    primary key 主键,要唯一的标识记录

    foreign key 外键

    not null  表示该字段不能为空

    unique key 表示该字段的值时唯一

    auto_increment 表示该字段的值是自动增长的

    default 为字段设置默认值。

    unique唯一

    单列唯一,表示该字段的值是唯一的

    联合唯一:单个的可以重复,但2个或多个加在一起的就不能重复。

    联合唯一要写在语句的最后,

    # 单列唯一
    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);

    not null 加default:

    create table user(
        id int,
      name char(16)
    );
    insert into user values(1,null)  # 可以修改
    
    alter table user modify name char(16) not null;
    insert into user(name,id) values(null,2);  # 报错 插入数据可以在表名后面指定插入数据对应的字段
    
    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')  # 成功

    primary key  主键

    限制效果等于not null + unique 组合效果一致,非空且唯一。

    create table t18(id int primary key);

    primary key 也是innodb引擎查询必备的索引。索引就是加快查询的速度。

    innodb创建表必须要有一个主键,如果没有设置会怎么样呢?

    1.会将非空且唯一的字段升级为主键。

    2.当表中没有任何约束条件的时候,会用内置的,但这个内置的在查询数据上不会有任何帮助,查询数据的速度就会慢。

     那么主键一般给谁呢?

    通常每张表中会有一个id字段,并且将id字段设置为主键字段。

    联合主键,是将多个字段联合起来作为表的主键,但本质上只有一个主键

    create table t18(
        ip char(16),
      port int,
      primary key(ip,port)
    );
    desc t18;

    而主键作为数据的编号,应该最好具有自增的功能:

    create table t13(
        id int primary key auto_increment,
      name char(16)
    );
    insert into t13('jason'),('jason'),('jason');  # id字段自动从1开始递增
    # 注意:auto_increment通常都是加在主键上,并且只能给设置为key的字段加

    补充:

    delete from 表名;删除表中所有数据,但再次输入id依然是延续上一次的id

    truncate 表名:初始化表,id也重置。

    束---

  • 相关阅读:
    PreparedStatement/Statement处理insert update等操作时乱码,以及URL
    MySQL unique 注意
    web乱码解决了
    实用工具及Chrome插件及实用网站(持续更新中...)
    前端常用算法集合,持续更新...
    各种问题汇总解决方法,持续更新中...
    node实现自动化图片切割压缩, 部署页面
    移动端图片缩放插件Pinchzoom.js
    提示框简单封装
    模拟滚动条
  • 原文地址:https://www.cnblogs.com/xinfan1/p/11378024.html
Copyright © 2011-2022 走看看