zoukankan      html  css  js  c++  java
  • 8.19MySQL(二)

    一、存储引擎

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

    1.mysql存储引擎

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

      myisam:mysql老版本用的存储引擎

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

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

    2.查看所有的存储引擎

      show engines;

    3.研究一下每个存储引擎存取数据的特点

    (1)Innodb:两个文件,一个是表结构文件,一个是真实数据文件

    (2)myisam:三个文件,表结构文件,真实数据文件,索引文件(目录)

    (3)memory:一个文件,表结构文件

    (4)blackhole:一个文件,表结构文件

    二、创建表的完整性约束

    1.创建表的完整语法

    create table 表名(
                字段名1 类型[(宽度) 约束条件],
                字段名2 类型[(宽度) 约束条件],
                字段名3 类型[(宽度) 约束条件]
                );

    注意:

      (1)字段名和字段类型是必须的  中括号内的参数都是可选参数

      (2)同一张表中字段名不能重复

      (3)最后一个字段后面不能加逗号,例如:

    create table t6(
        id int,
        name char,
        );  # 错误

    宽度:

      (1)使用数据库的准则:能尽量让它少干活就尽量少干活

      (2)对存储数据的限制:char(1),只能存一个字符

          1.如果超了,mysql会自动帮你截取

          2.会直接报错(mysql严格模式)

    类型和中括号内的约束条件有什么区别:

      类型约束的是数据的存储类型

      而约束条件是基于类型之上的额外限制

    2.约束条件:如何限制一个字段不能插空

      alter table t5 modify name char not null;

      not null 约束条件,该字段不能插空

    三、严格模式

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

    1.模糊匹配

      like

        %匹配任意多个字符

        _匹配任意一个字符

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

    2.修改严格模式

      set session:临时有效,只在你当前操作的窗口有效

      set global:全局有效,终生有效

        set global sql_mode = 'STRICT_TRANS_TABLES';

      修改完之后退出当前客户端重新登陆即可

    四、字段类型

    1.整型

      SMALLINT、TINYINT、INT、BIGINT

    TINYINT

      create table t6(id TINYINT);

      默认是带有符号的(-128,127)

      超出之后只会存最大值或者最小值

    怎样改成无符号

      alter table t6 modify id TINYINT unsigned;

      就改成无符号的(0,255)

    INT

      也是默认带有符号的

      超出之后只会存最大值或者最小值

      改成无符号与上方法一致

    括号内的数字

    char后面的数字是用来限制存储数据的长度的

    特例:

    只有整型后面的数字不是用来限制存储数据的长度,而是用来控制展示的数据的位数

    int(8):够/超8位有几位存几位,不够8位空格填充

    zerofill:修改约束条件,不够8位的情况下,用0填充

    强调:

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

    只要是整型,都不需要指定宽度,因为有默认的宽度,足够显示对应的数据

    约束条件:

      not null       不能为空

      unsigned    无正负符号

      zerofill      0填充多余的位数

    2.浮点型

      float(255,30):总共255位,小数部分占30位

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

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

      前一位表示所有的位数,后一位表示小数个数

    精确度

      验证

    create table t12(id FLOAT(255,30));
    create table t13(id DOUBLE(255,30));
    create table t14(id DECIMAL(65,30));
            
    insert into t12 values(1.111111111111111111111111111111);
    insert into t13 values(1.111111111111111111111111111111);
    insert into t14 values(1.111111111111111111111111111111);

      精确度:float < double < decimal

    3.字符类型

      char(4):最大只能存四个字符,超出来会直接报错,如果少了,会自动用空格填充

      varchar(4):最大只能存四个字符,超出来会直接报错,如果少了,有几个存几个

    create table t15(name char(4));
    create table t16(name varchar(4));

      char_length():获取一个字符的长度

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

      可以通过严格模式,来修改该机制,然后退出客户端重新登陆,这样mysql就不做自动去除末尾空格的操作,

    set global sql_mode="strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH";

    char与varchar的使用区别

    name char(5):char定长

      优点:存取速度都快

      缺点:浪费空间

    name varchar(5):varchar变长

      优点:节省空间

      缺点:存取速度慢(较于char比较慢)

          存的时候,需要给数据讲一个记录长度的报头

          取的时候,需要先读取报头才能读取真实数据

    4.日期类型

      date:2019-05-01  年月日

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

      time:11:11:11  时分秒

      year:2019  年

    测试:

    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');

    5.枚举与集合类型

    分类

      枚举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') # 集合也可以只存一个

    五、约束条件

    1.not null:不能为空

    2.default:给某个字段设置默认值(当用户写了的时候用用户的,当用户没有写就用默认值)

      create table t17(id int,name char(16) default 'jason');

    往表中插入数据的时候,可以指定字段进行插入,不需要全部都插入

      insert into t17(name,id) values('egon',2);

    3.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);

    4.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);

      primary key也是innodb引擎查询必备的索引

    innodb引擎在创建表的时候,必须要有一个主键

    当你没有指定主键的时候

      1.会将非空且唯一的字段自动升级成主键

      2.当你的表中没有任何的约束条件,innodb会采用自己内部默认的一个主键字段

        该主键字段你在查询时候是无法使用的

        查询数据的速度就会很慢

        类似于一页一页的翻书

    create table t12(
        id int,
      name char(16),
      age int not null unique,
      addr char(16) not null unique
    );

    主键字段到底该设置给谁

      通常每张表里面都应该有一个id字段

      并且应该将id设置为表的主键字段

    联合主键

      ***多个字段联合起来作为表的一个主键,本质还是一个主键***

      ***PS:innodb引擎中一张表有且只有一个主键***

    主键字段应该具备自动递增的特点:primary key auto_increment

      主键id作为数据的编号,每次最好能自动递增

      每次添加数据,不需要用户手动输入

      auto_increment:自动递增

    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 t21;  仅仅是删除数据,不会重置主键

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

    truncate t21;  初始化表,会重置主键

      将整张表重置,id重新从0开始记录

  • 相关阅读:
    Python学习4
    Python学习3
    Python学习2
    表空间
    sqlplus常用设置
    HashMap和LinkedHashMap
    堆栈源码
    观察者模式
    策略模式
    java线性表
  • 原文地址:https://www.cnblogs.com/francis1/p/11379945.html
Copyright © 2011-2022 走看看