• 8_19 数据库


    一。存储引擎

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

      MySQL中也有不同的存储引擎:

      1.InnoDB MySQL默认的存储引擎。

        innoDB比myisam存储数据要安全。

        innoDB支持事务。

        innoDB支持行锁。就是对一行数据的操作为串行。

        innoDB支持外键。

      2.myisam:MySQL老版本使用的存储引擎。

        myisam比InnoDB读取速度快。

      3.memory:内存引擎。所有的数据都存在内存中,断电即消失。

      4.blackhole:无论存什么数据都立马消失,像一个黑洞一样。

      方法:

      使用show engines=存储引擎。  查看MySQL的所有引擎。

      MYI:索引

      MYD:真实数据

    二。创建表的完整语法

      创建表有一个完整的语法:

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

      注意:

      1. 在同一张表中,字段名不能相同

      2. 宽度和约束条件可选,字段名和类型是必须的

      3. 最后一个字段后不能加逗号!

         宽度:是对存储数据的限制。

          如,char(1)就是限制字符只能输出一个字符。

          如果超出了这个范围就会出现两个情况:
          1,在非严格模式下,会自动帮你截取数据。

          2,在严格模式下,会报错。

         约束条件:
          在表中,如果你要限制数据时,需要约束条件的帮助。

          如,如果想让一个字段中不能为空,可以修改字段为:

    alter table t2 modify name char(4) not null

        这样后面存储的name就不能时null,之前存储的null值将会变成空白。  

        中括号中的约束数基于数据类型的约束之上的。

    三。数据类型之整型

      在定义一个整型数据时需要对其长度进行约束,其中的数字代表的可存储的数据如下:

     

       其中一个字符占8个字节,一个字节就可以存储2^8个。

      整型默认的是无符号类型的,可以使用关键字unsigned使得没有正负符号。

      注意:
      在整型限制宽度中,其设置的宽度不代表它显示的值的位数,而是它所需要填充的位数。

      如,int(8)中,如果你输入 数大于8位,那就按照定义的数据类型显示数字大小。

      如果,输入的数字小于8位,则剩余的位数默认使用空格填充,

      使用zerofill可以改用0填充。

      只要是整型,都不需要设置宽度。

    四。严格模式。

      在用户输入数据的时候,表的宽度决定了你所输入数据的显示长度(除了整型),如果输出的长度超过了宽度,在非严格模式下,会自动帮助切分,但是设置了严格模式,就会报错。

      为了数据的准确性,我们可以通过设置严格模式,限制用户的输入。

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

      准确找到mysql的模式可以使用模糊匹配输出和mode有关的:

      %匹配任意多个字符

      _匹配任意一个字符

      like,模糊匹配,匹配带有某个字符的名字。

      所以可以通过以下语句搜寻关于mode的:

    show variables like "%mode%"

      输出结果如下:

      其中sql_mode就是数据库是否为严格模式。

      设置分为两个方法:

      1.set session 临时有效,关闭了该窗口之后就会失效。

      2.set global,全局有效,设置以后就会一直有效。

      设置语句:

    set global sql_mode ='STRICT_TRANS_TABLES'

      这样设置以后,用户再向其输入超长的字符串就会报错。

    五。浮点型

      浮点型的设置宽度比整型多一个小数部分的设置。

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

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

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

      这些都是它们的最大位数的限制.

      而它们最大的区别在于精确。

      float < double < decimal 根据使用场景来选择浮点数的类型。

      对于精确度和数据存储的方法,还有一个方法:

      将小数点转换成字符串存入数据库,读取后再转换成浮点型数据。

    六。字符类型

      字符类型分为两种:

        1.char(4)

          最大只能存储4个字符,超出来的部分会直接报错。如果少了会用空格填充。

        2.varchar(4)

           最大存储4个字符,超出来的部分也会报错,少了的话,有几个就会存入几个。

      在存入数据的时候,硬盘会将char中填充的空格存入,取出的时候,会自动将空格取消,所以,为了研究char与varchar的区别,需要使用set global改变模式。

    set global sql_mode="strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH";

      注意,之前修改的严格模式也要加上,因为这个操作是替换而非累加。

      设置好模式后使用char_length(字段),查看数据的长度。

    select char_length(names) from t5;

      可以看出char和varchar还是有不同的地方:

      char定长,1.浪费空间,2.取值的时候方便,直接按长度取值。

      varchar变长,1.节省空间,2.取值繁琐,需要获取数据的长度,需要加一个记录数据长度的报头。

     七。日期类型

      日期类型分为4个类型。

      1.date 2019-05-01

      2.time 11.11.11

      3.datetime 2019-01-02 11.11.11

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

    八。枚举与集合类型

      在数据输入的时候,控制用户输入数据的情况时,使用枚举类型。

      如,性别,民族等,可输入类型较少,可以用枚举类型定义。

      语法,关键字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')  # 集合也可以只存一个

      set种的元素使用‘,’分隔。

    九。约束条件

      not null 不能为空;

      default  给某个字段设置默认值。如果用户输入了值后,就写入用户传入的值,如果用户没有写入值,就写入默认值。

      写入数据的第二种方式,可以在表名后指定特定值,就可以只输入该值,其他值为空。

    insert into tb(id) values(1);

      unique 唯一

      在表中,如果想要一个字段的值只有唯一值。也就是限制某一字段唯一。

     alter table t8 modify id int unique;

      unique也可以设置多个值,代表这几个值共同唯一。

      应用场景如同ip+post,标记一台计算机上的某个应用。  

      举例:

     create table b9(
        -> id int,
        -> ip int,
        -> post int,
        -> name char,
        -> unique(ip,post)
        -> );

      unique()要在字段定义 的最后使用,括号中填写你要练习的字段,这些字段构成一起不能出现重复。

      primary key 主键

      主键的限制的效果与not null+unique组合的效果相同,非空且唯一。

    create table b2(id int primary key);

      一个字段可以跟多个限制条件(MUL)

    create table b2(id int primary key not null);

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

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

      当没有指定主键时:

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

        也就是not null + unique

        2.当你的表中没有任何的约束条件,innodb会采用自己的内部默认的一个主键字段,该主键字段你在查询时候是无法使用的,查询数据的速度就会很慢,类似于一页一页的翻书

       例子:

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

      如图:

      MySQL自动将第一个非空且唯一的age设置成主键(pri)。

      一般的,通常把表中需要有个id字段,将id设置成主键。

      联合主键:多个字段连接起来作为表的 一个主键,本质上还是一个主键。

       举例:

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

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

      auto_increment 自动递增。限制条件。

      设置了这个限制之后,就会自动在其数值上递增,可以不传入参数。

      但是当里面的数据被删除后,继续添加数据,其自动增加的数字会接着删除的数据后面。

     create table b4(
        -> id int primary key auto_increment,
        -> name char
        -> );

      结果如图:

      图1:

      图2:

      

    补充:

      使用:truncate 表名,可以清空整个表,包括使用auto_increment 留下的记录。


     

  • 相关阅读:
    面向对象设计与实用的思考(主动对象与被动对象)
    改进弧长法 判断点是否在多边形内 c#代码
    PaintCode begin
    kiwivm putty lnmp
    初心已变,我也不是当时的我
    spfa
    tree dp
    开心就好之修行ing
    MIME 参考手册
    TypeScript学习和参考手册
  • 原文地址:https://www.cnblogs.com/LZXlzmmddtm/p/11377988.html
Copyright © 2020-2023  润新知