存储引擎 数据类型

笑着哭i 提交于 2019-11-27 21:47:26

不同的数据应该有不同的处理机制    
        mysql存储引擎
            Innodb:默认的存储引擎  查询速度较myisam慢  但是更安全
            myisam:mysql老版本用的存储引擎
            memory:内存引擎(数据全部存在内存中)
            blackhole:无论存什么 都立马消失(黑洞)       
       show engines;  查看所有存储引擎存取数据的特点

数据类型
      整型, 浮点型, 字符类型, 日期类型, 枚举与集合类型

约束
      not null, unique, default, primary key  ...

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

注意:

  1.字段名和字段类型是必须的  中括号内的参数都是可选参数
        2.同一张表中字段名不能重复
        3.最后一个字段后面不能加逗号

宽度:
        使用数据库的准则: 能尽量让它少干活就尽量少干活     
        对存储数据的限制  char(1)  只能存一个字符, 如果超了mysql会自动帮你截取
            1.插入的时候 mysql自动截取
            2.会直接报错(mysql严格模式)
        alter table t5 modify name char not null;    not null该字段不能插空
类型和中括号内的约束
        类型约束的是数据的存储类型 , 而约束是基于类型之上的额外限制

字段类型
        整型: SMALLINT     TINYINT     INT      BIGINT     
        TINYINT
            默认是否有符号   默认是带有符号的(-128,127)
            超出限制会如何   超出之后只会存最大值或者最小值
        create table t6(id TINYINT);
        not null        不能为空
        unsigned    无正负符号
        zerofill        用0填充多余的位数
      char后面的数字是用来限制存储数据的长度的
      特例:只有整型后面的数字不是用来限制存储数据的长度 而是用来控制展示的数据的位数
      int(8)  够/超8位有几位存几位,不够8位空格填充
      修改约束条件  不够8位的情况下 用0填充
      强调:**对于整型来说,数据类型后的宽度并不是存储限制,而是显示限制,所以在创建表时,如果字段采用的是整型类型,完全无需指定显示宽度, 默认的显示宽度,足够显示完整当初存放的数据,只要是整型 都不需要指定宽度 因为有默认的宽度 足够显示对应的数据。

模糊匹配    like
            %匹配任意多个字符
            _匹配任意一个字符    
        set session  临时有效  只在你当前操作的窗口有效
        set global   全局有效  终生有效
        set global sql_mode = 'STRICT_TRANS_TABLES';
        设置完之后 你只需要重新退出客户端再次进入即可


    浮点型
        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

字符类型
        char(4)  # 最大只能存四个字符 超出来会直接报错  如果少了 会自动用空格填充
        varchar(4)   # 最大只能存四个字符 超出来会直接报错  如果少了 有几个存几个
        create table t15(name char(4));
        create table t16(name varchar(4));    
        char_length()   
        mysql在存储char类型字段的时候 硬盘上确确实实存的是固定长度的数据
        但是再取出来的那一瞬间 mysql会自动将填充的空格去除
        
        可以通过严格模式 来修改该机制 让其不做自动去除处理
        
        
        
        char与varchar的区别
            char定长
                1.浪费空间
                2.存取速度快
                
                
            varchar变长
                1.节省空间
                2.存取速度慢(较于char比较慢)
                    存的时候 需要给数据讲一个记录长度的报头
                    取的时候 需要先读取报头才能读取真实数据
            
        
        char(4)                        varchar(4)
        取的时候方便                取的时候比较繁琐了 无法知道数据到底多长
        直接按固定的长度取即可        
        
    
    日期类型
        date
        datetime
        year
        time
    
    
    
    枚举与集合类型
        枚举(enum)  限制某个字段能够存储的数据内容
        集合(set)   限制某个字段能够存储的数据内容
        
        

约束条件
    not null  不能为空
    default   给某个字段设置默认值(当用户写了的时候用用户的,当用户没有写就用默认值)
    create table t17(id int,name char(16) default 'jason');    
        
    
    往表中插入数据的时候  可以指定字段进行插入 不需要全部都插
    insert into t17(name,id) values('egon',2);
    
    
    unique 唯一
    
    单列唯一   限制某一个字段是唯一的
    联合唯一(在语句的最后 用括号的形式 表示哪几个字段组合的结果是唯一的)
        ip
        port
        
        create table server(
                id int,
              ip char(16),
              port int,
              unique(ip,port)
            )
    
    primary key  主键
        限制效果跟 not null + unique 组合效果一致   非空且唯一
        
        create table t18(id int primary key);
    
        
        primary key也是innodb引擎查询必备的索引
            索引你就把当成书的目录
            
        innodb引擎在创建表的时候 必须要有一个主键
        当你没有指定主键的时候
            1.会将非空切唯一的字段自动升级成主键
            2.当你的表中没有任何的约束条件  innodb会采用自己的内部默认的一个主键字段
                该主键字段你在查询时候是无法使用的
                查询数据的速度就会很慢
                类似于一页一页的翻书
                
                create table t19(
                    id int,
                  name char(16),
                  age int not null unique,
                  addr char(16) not null unique
                );
                
        主键字段到底设置给谁呢???
            通常每张表里面都应该有一个id字段
            并且应该将id设置为表的主键字段
        
        联合主键:多个字段联合起来作为表的一个主键,本质还是一个主键!!!
            !!!!!!!!!!!!!!!!!ps:innodb引擎中一张表有且只有一个主键!!!!!!!!!!!!!!!!!!!!!!!
        
        
        
        create table t20(
                ip char(16),
              port int,
              primary key(ip,port)
            );
            desc t20;
    
    
        主键字段应该具备自动递增的特点
            每次添加数据  不需要用户手动输入
            auto_increment  自动递增
        create table t21(id int primary key auto_increment,name varchar(16));
    
        create table t22(id int primary key,name varchar(16));
    
    
    delete from  仅仅是删除数据   不会重置主键
    truncate   初始化表  会重置主键

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!