zoukankan      html  css  js  c++  java
  • 数据库-----数据类型、完整性约束

    一、数据类型

      1、数字:

        整型:tinyint :有符号范围在(-128,127) 无符号范围在(0,255)使用unsigned    

           int :int类型后面的存储显示宽度,而不是存储宽度,位数不够用zerofill来用0填充 

              bigint :

        小数:

          float:在位数比较短的情况下不精准,

          float(m,d)    m是全长,d是小数点后个数。m最大值为255,d最大值为30

          double:在位数比较长的情况下不精准

          double(m,d)    m是全长,d是小数点后个数。m最大值为255,d最大值为30

          decimal:(如果是用小数,则用推荐使用decimal)

            精准

            内部原理是以字符串形式去存

          decimal[(m[,d])]   [unsigned]   [zerofill]  m是整数部分总个数(负号不算)d是小数点后个数。m最大值为65,d最大为30。

      2、字符串:

        char(10):简单粗暴,浪费空间,存取速度快

        # char类型:定长,简单粗暴,浪费空间,存取速度快

          字符串范围:0-255(一个中文是一个字符,是utf8编码的3个字节)

          存储char类型的值时,会往右填充空格来满足长度

          检索:

            当我们打开pad_char_to_full_length SQL模式(设置SQL模式:SET sql_mode="PAD_CHAR_TO_FULL_LENGTH"; 查询sql的默认模式:select @@sql_mode;)查出的结果就不会自动删除尾部的空格。

        varchar:精确,节省空间,存取速度慢

        # varchar类型:变长,字符长度范围:0-65535    varchar类型存储数据的真实内容,不会用空格填充,就算是空格也会被存起来

        length() :查看字节数

        char_length() :查看字符数

      3、时间类型:

        year:YYYY(1901/2155)

        date:YYYY-MM-DD(1000-01-01/9999-12-31)

        time:HH:MM:SS(-838:59:59/838:59:59)

        datetime:YYYY-MM-DD  HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59)

        TIMESTAMP:YYYYMMDD HHMMSS(1970-01-01 00:00:00/2037 年某时)

        # 调用mysql自带的now()函数,获取当前类型指定的时间 如下结构:

        insert into t1 values(now(),now(),now());

      4、枚举类型与集合类型

        enum   和  set

        enum('vip1','vip2','vip3','vip4'),# 在指定范围内,多选一

        set('play','music','read','study') # 在指定范围内,多选多

    二、完整性约束

      1、not null   和  default

        not null  标识该字段不能为空

        default 为该字段设置默认值(默认值可以为空)   

    create table tb1(
        nid int not null default 2,
        num int not null
    );

      2、unique

        中文翻译:不同的,在mysql中称为单列唯一  

    # 第一种创建unique
    create table department(
        id int,
        name char(10) unique
    );
    
    create table department(
        id int unique,
        name char(10) unique
    );
    
    # 第二种创建unique的方式
    create table department(
        id int,
        name char(10),
        unique(id),
        unique(name)
    );

      3、联合唯一

    # 联合唯一 只要两列记录 有一列不同 既符合联合唯一的约束
    create table services(
        id int,
        ip char(15),
        port int,
        unique(id),
        unique(ip,port)
    );

    三、primary key

      一个表中可以:

      单列做主键

      多列做主键(复合主键)

      约束:等价于not null unique,字段的值不为空且唯一。

      存储引擎默认是(innodb):对于innodb存储引擎来说,一张表必须有一主键。

      1、单列主键

    # 创建t1表,为id字段设置主键,唯一的不同的记录
    create table t1(
        id int primary key,
        name char(16)
    );
    
    insert into t1 values(1,"王")(2,"建");
    insert into t1 value(2,"山");   # 会报错,因为id是唯一,已经存在id=2了
    
    
    # not null + unique的化学反应,相当于给id设置primary key
    create table t2(
        id int not null unique,  # 相当于primary key
        name char(16)
    );
    单列主键的使用

      2、复合主键

    # 只要id,port其中有一不相同就可以插入
    create table t3(
        ip char(15),
        port int,
        primary key(ip,port)
    );

    四、auto_increment

      约束:约束的字段为自动增长,约束的字段必须同时被key约束

    # auto_increment之前必须加primary key,确保id是唯一且不同
    create table student(
        id int primary key auto_increment, # 这里往进插的时候也可以指定id
        name varchar(20),
        sex enum('male','female') default 'male',
        hobby set('','','')
    );
    # 对于自增的字段,在用delete删除后,再插入值,该字段仍按照删除前的位置继续增长,
    例如:delete from student where id=2,
    # 应该用truncate清空表,比起delete一条一条的删除记录,truncate是直接清空表,在删除大表时用它

    五、foreign key

      创建两张关联表操作:

    # 创建表时先创建被关联表,再创建关联表
    # 先创建被关联表
    create table dep(
        id int primary key,
        name varchar(20) not null,
        descripe varchar(20) not null
    );
    
    # 再创建关联表(emp表)
    create table emp(
        id int primary key,
        name varchar(20) not null,
        age int not null,
        dep_id int,
        constraint fk_dep foreign key(dep_id) references dep(id)
    );
    # 插入记录时,先往被关联表中插入记录,再往关联表中插入记录
    # 如果我们想删除某个部门,并且这个部门的员工表的有关联的记录相继删除,我们需要做一下事情:
    constraint fk_dep foreign key(dep_id) references dep(id)
    on delete cascade # 同步删除
    on update cascade # 同步更新
    # 这是一句话,(不要用逗号隔开)
  • 相关阅读:
    ubuntu安装软件失败
    阶乘函数 注意事项
    汇编退出
    vim比较文件
    汇编调试
    Redis
    记录一次ajax使用
    oracle11g导出dmp文件时不能导出空表,导致缺表
    将小数点后的0去掉
    redis
  • 原文地址:https://www.cnblogs.com/wjs521/p/9671712.html
Copyright © 2011-2022 走看看