zoukankan      html  css  js  c++  java
  • 数据库(二)基本数据类型及约束条件

    1.基本数据类型和约束条件初始

    建表的时候,字段都有对应的数据类型

      1.整型

      2.浮点型

      3.字符类型

      4.日期类型

      5.枚举与集合

    约束条件

      1.primary key

      2.unique key

      3.not null

    # 语法
    create table 表名(
    字段1 类型[(宽度) 约束条件],
    字段2 类型[(宽度) 约束条件],
    字段3 类型[(宽度) 约束条件]
    )
    
    # 注意:
    1. 在同一张表中,字段名不能相同
    2. 宽度和约束条件可选,字段名和类型是必须的
    3. 最后一个字段后不能加逗号!
    
    # 补充:
    # 1.宽度指的是对存储数据的限制
    create table userinfo(name char);
    insert into userinfo values('jason');
    """
    1.没有安全模式的数据库版本,能够存放数据但是只会存进去一个j
    2.最新数据库版本直接报错提示无法存储:Data too long for column 'name' at row 1
    """
    
    # 2.约束条件初识>>> null 与 not null
    create table t1(id int,name char not null);
    insert into t1 values(1,'j');  # 正常存储
    insert into t1 values(2,null);  # 报错
    
    # 总结 类型与约束条件区别
    # 类型:限制字段必须以什么样的数据类型存储
    # 约束条件:约束条件是在类型之外添加一种额外的限制

    2.整型

    整型的分类:TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT

    整型的作用:描述如年龄,等级,id等数据

    类型的存储范围:

    验证整型字段默认有无符号及范围

    # 创建表t2并指定参数类型
    create table t2(id int);
    # 向表中插入相应参数
    insert t2 values(656),(98965699868),(-68589486494887),(-56654)

    结果:整型字段默认是有符号的,范围为-2147483648到2147483647,超过范围默认使用最大值或者最小值

    疑问:类型后面的宽度能否改变字段存储的大小限制

    # 改变数据类型的存储形式
    alter table t2 modify id int(13) unsigned zero fill;
    # 添加新值进去
    insert t2 values(987654321321);

    结果:当指定无符号时,负数为变成0,并且对于整型来说,数据类型后面的宽度不是存储限制,而是显示限制,所以在创建表时,如果字段采用的是整型类型,完全无需指定显示宽度,默认的显示宽度,足够显示完整存放的数据.

    严格模式补充

    我们在存储超过指定或者最大的存储长度时也能存进去,只是mysql帮我们自动截取了最大长度,为了减少数据库的操作,缓解压力,我们需要设置安全模式

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

    3.浮点型

    浮点型的分类:FLOAT,DOUBLE,DECIMAL

    浮点型的应用场景:身高,体重,薪资

    三者的最大整数位和小数位的对比

    # 存储限制
    float(255,30)
    double(255,30)
    decimal(255,30)
    
    # 精确度验证
    create table t4(s float(255,30));
    create table t5(s double(255,30));
    create table t6(s decimal(65,30));
    
    insert t4 values(1.111111111111111111111111111111);
    insert t5 values(1.111111111111111111111111111111);
    insert t6 values(1.111111111111111111111111111111);

    精确度:float < double < decimal

    4.字符类型

    字符类型的分类:char(定长),varchar(变长)

    字符类型的作用:姓名,地址等描述性信息

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

    针对char类型,mysql在存储时会将数据用空格补全存放在硬盘中,但是在读出结果的时候自动取掉末尾的空格

    char和varchar的使用区别

    char优点:存取速度快

      缺点:浪费空间

    会将不满位数的数据补全,所以相对浪费空间

    varchar优点:节省空间

        缺点:存取速度慢

    在数据前加入一个字节位的报头,来确定该数据的长度,所以取数据前需要先确定长度,存取速度慢

    5.时间类型

    时间类型的分类:date:2019-08-19

            time:11:11:11

            datatime:2019-08-19 11:11:11

            year:2019

    测试:

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

    6.枚举和集合类型

    分类:枚举enum多选一

       集合set多选多

    枚举测试:多选一

    create table t10(
        id int,
        name char(16),
        gender enum('male','female','others')
    );
    insert t10 values(1,'tank','sss');  # 报错
    insert t10 values(2,'xxx','others');  # 正确

    集合测试:多选多

    create table t11(
        id int,
        name char(16),
        gender enum('male','female','others'),
        hobby set('read','sleep','sanna','dbj')
    );
    insert t11 values(1,'tank','male','read','sleep') 

    7.约束条件

    约束条件汇总

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

    不为空not null

    # 创建表
    create t12(
        id int,
        name char(16)
    );
    
    # 修改表不能为空,也可以在创建时指定
    alter table t12 modify name varchar(16) not null;
    
    # 插入数据
    insert t12 values(1,null);  # 报错,不能为空
    insert t12 values(2,'sxc');  # 正常插入数据

    设置默认值default

    # 创建表,指定默认值
    create table t13(
        id int,
        name varchar(16);
        gender enum('male','female','others') dafault 'male'
    );
    # 指定其他参数,默认参数不填
    insert t13(id,name) values(1,'sxc');

    设置唯一unique

    # 单列唯一
    create table t14(
        id int unique,
        name char(16)
    );
    insert t14 values(1,'sxc'),(1,'zzp');  # 报错
    insert t14 values(1,'sxc'),(2,'sxc');  # 成功

    # 联合唯一
    create table t15(
        id int,
        ip varchar(16),
        port int,
        unique(ip,port)
    )
    insert t15 values(1,'127.0.0.1',8080);
    insert t15 values(1,'127.0.0.1',8000);
    insert t15 values(1,'127.0.0.2',8080);
    insert t15 values(2,'127.0.0.1',8080);  # 当ip和port同时相同报错

    设置主键和递增primary key+auto_increment

    # 单从约束的能力来看primary key等价于not null+unique
    create table t16(id int primary key);
    desc t16;
    insert t16 values(1),(1);  # 报错
    insert t16 values(1),(2);  # 成功

    主键也是Innodb引擎组织数据的依据,提升查询效率

    1.一张表中必须有且只有一个主键,如果没有设置主键,那么会从上到下搜索直到遇到一个非空且唯一的字段将其自动设置为主键

    create tabel t17(
        id int,
        name char(16),
        age int not null unique
    );
    desc t12;  # 会自动将age升级为主键

    2.如果表中没有任何主键并且也没有什么可以被设置为主键的字段,那么Innodb会采用自己默认的隐藏字段作为主键,但是使用这个隐藏字段在查询的时候就无法根据主键字段加速查询了

    类似于书的目录,没有主键就相当于一页一页翻着查

    3.一张表中通常都应该有一个id字段,并且通常将这个id字段作为主键

    联合主键

    # 联合主键
    create table t18(
        ip varchar(16),
        port int,
        primary key(ip,port)
    );
    desc t18

    主键的递增

    # 主键的递增,auto_increment
    create table t19(
        id int primary key auto_increment,
        name varchar(16)
    );
    insert t19 values('sxc'),('sxc'),('sxc');  # id字段从1开始递增

    注意:auto_increment通常都是加在主键上,并且只能给设置为key的字段加

    清空表的补充

    delete from t19:

    这条命令只能将数据全部删除,但是并不会将id充值,如果主键是递增的模式,那么新添加的记录会接着上次删除的主键开始

    所以这条命令不适合用来清空表,是用来删除表中一些符合条件的记录后面一般跟where

    如上图所示,当删除表中记录后新添加的记录id会接着删除的记录递增

    如果要清空表,使用truncate t19;

    作用:将整张表重置,id重新从0开始

    如上图所示,truncate能够真正的将表重置

    35

  • 相关阅读:
    实现一个圆形进度条
    给你的jQuery项目赋予Router技能吧
    matlab新手入门(四)(翻译)
    matlab新手入门(三)(翻译)
    matlab新手入门(二)(翻译)
    matlab新手入门(一)(翻译)
    安装Matlab出现Error 1935错误解决方法
    Linux Ubuntu下Jupyter Notebook的安装
    lung 分割论文
    链表的回文结构
  • 原文地址:https://www.cnblogs.com/sxchen/p/11379584.html
Copyright © 2011-2022 走看看