zoukankan      html  css  js  c++  java
  • mysql数据类型和约束条件

    存储引擎

    原因:不同的数据应该有不同的处理机制;

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

      myisam:mysql=老版本的存储引擎。

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

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

    读取每个数据的特点:

        show engines;

    MySQL表介绍

    表就相当于文件,表中的一条记录就相当于文件的一行内容,不同的是表中的一条记录有对应的标题,称为表的字段。

    id,name,age,sex,phone,job
    1,Alex,83,female,13651054608,IT
    2,Egon,26,male,13304320533,Tearcher

    把上面内容改成表应该是下面这样的

    id,name,age,sex,phone,job称为字段,其余的,一行内容称为一条记录。

    创建表

    创建表的完整语法
        create table 表名(
            字段名1 类型[(宽度) 约束条件],
            字段名2 类型[(宽度) 约束条件],
            字段名3 类型[(宽度) 约束条件]
            );
    注意:
        1.字段名和字段类型是必须的  中括号内的参数都是可选参数
        2.同一张表中字段名不能重复
        3.最后一个字段后面不能加逗号
            create table t6(
                id int,
                name char,
                );
    
    宽度:
        使用数据库的准则:能尽量让它少干活就尽量少干活
        
        对存储数据的限制
        char(1)  只能存一个字符
        如果超了 mysql会自动帮你截取
            1.插入的时候 mysql自动截取
            2.会直接报错(mysql严格模式)
    
    类型和中括号内的约束
        类型约束的是数据的存储类型
        而约束是基于类型之上的额外限制

    开启严格匹配

    模糊匹配:
    like
        %匹配任意多个字符
         _匹配任意一个字符
    
    show variables like "%mode%";  # 查看数据库配置中变量名包含mode的配置参数
    
    set session # 临时有效 只在当前操作界面有效
    set global  # 全局有效 终生有效
    
    set global sql_mode ='STRICT_TRANS_TABLES'
    # 修改完之后退出当前客户端重新登陆即可

    MySQL数据类型与约束条件介绍

    整型

    分类:TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT

    作用:存储年龄,等级,id,各种号码等。

    类型参考范围如下图:

    范围验证

    显示时,不够8位用0填充,如果超出8位则正常显示

    create table t1(x tinyint);
    insert into t1 values(128);
    
    create table t1(x tinyint);
    insert into t1 values(127);
    
    create table t1(x tinyint);
    insert into t1 values(-128);
    
    create table t1(x tinyint);
    insert into t1 values(-129);

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

     浮点型

    分类:FLOAT、DOUBLE、decimal

    应用场景:身高,体重,薪资

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

    create table t3(x float(255,30));
    create table t4(x double(255,30));
    create table t5(x decimal(65,30));
    
    insert into t3 values(1.111111111111111111111111111111);
    insert into t4 values(1.111111111111111111111111111111);
    insert into t5 values(1.111111111111111111111111111111);

    精确度
    float < double < decimal

    字符类型

    分类:char(定长)、varchar(变长)

    作为:姓名,地址,描述类信息

    create table t6(name char(4))  # 超出四个字符报错,不够四个字符空格补全
    create table t7(name varchar(4))  # 超出四个字符报错,不够四个有几个就存几个
    # 验证存储限制
    insert into t12 values('hello');
    insert into t13 values('hello');

    char_length()  
    
    #mysql在存储char类型字段的时候 硬盘上确确实实存的是固定长度的数据
    #但是再取出来的那一瞬间 mysql会自动将填充的空格去除
        
    #可以通过严格模式 来修改该机制 让其不做自动去除处理
    set global sql_mode="strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH";
    # 退出客户端重新登陆

    char与varchar的区别
        char定长
            1.浪费空间
            2.存取速度快
            varchar变长
            1.节省空间
            2.存取速度慢(较于char比较慢)
                    存的时候 需要给数据讲一个记录长度的报头
                取的时候 需要先读取报头才能读取真实数据
            
    char(4)                        varchar(4)
        取的时候方便                取的时候比较繁琐了 无法知道数据到底多长
        直接按固定的长度取即可        

    日期类型

    分类:

    date:2019-05-01

    datetime:2019-01-02 11:11:11

    year:2019

    time:11:11:11

    枚举与集合类型

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

    约束条件

    """
    primary key   标识该字段为该表的主键,可以唯一的标识记录
    foreign key    标识该字段为该表的外键
    not null    标识该字段不能为空
    unique key    标识该字段的值是唯一的
    auto_increment    标识该字段的值自动增长(整数类型,而且为主键)
    default    为该字段设置默认值
    unsigned 无符号
    zerofill 使用0填充
    """

    not null+default

    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')  # 成功

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

    单列唯一 限制某一个字段是唯一的
    联合唯一(在语句的最后 用括号的形式 表示哪几个字段组合的结果是唯一的)

    primary key+auto_increment

    # 单从约束角度来说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);
    
    # 除了约束之外,它还是innodb引擎组织数据的依据,提升查询效率

    """
    强调:
    1.一张表中必须有且只有一个主键,如果你没有设置主键,那么会从上到下搜索直到遇到一个非空且唯一的字段自动将其设置为主键
    """
    create table t40(
        id int,
      name char(16),
      age int not null unique,
      addr char(16) not null unique
    )engine=innodb;
    desc t40;

    """
    2.如果表里面没有指定任何的可以设置为主键的字段,那么innodb会采用自己默认的一个隐藏字段作为主键,隐藏意味着你在查询的时候无法根据这个主键字段加速查询了
    索引:类似于书的目录,没有主键就相当于一页一页翻着查
    3.一张表中通常都应该有一个id字段,并且通常将改id字段作成主键
    """
    # 联合主键:多个字段联合起来作为表的一个主键,本质还是一个主键
    create table t50(
        ip char(16),
      port int,
      primary key(ip,port)
    );
    desc t50;

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

    delete from tb1;
    强调:上面的这条命令确实可以将表里的所有记录都删掉,但不会将id重置为0,
    所以收该条命令根本不是用来清空表的,delete是用来删除表中某一些符合条件的记录
    delete from tb1 where id > 10;
    
    如果要清空表,使用truncate tb1;
    作用:将整张表重置,id重新从0开始记录
  • 相关阅读:
    Python解析库lxml与xpath用法总结
    安装docker时,遇到Loaded plugins...怎么办
    【AcWing】第6场周赛 B题 3734. 求和 (思维)
    CF上部分树形DP练习题
    Codeforces Round #481 (Div. 3) 经典几道思维题
    KB专题:区间DP专辑
    ZOJ 3537 Cake (凸包 + 区间DP && 最优三角形剖分)
    AtCoder Beginner Contest 171 AK!
    【算法学习笔记】分段打表
    [apue] 多进程管道读写的一些疑问
  • 原文地址:https://www.cnblogs.com/wangnanfei/p/11379410.html
Copyright © 2011-2022 走看看