• day 7-14 数据库完整性约束


    一. 介绍

      约束条件与数据类型的宽度一样,都是可选参数

      作用:用于保证数据的完整性和一致性
      主要分为:

    PRIMARY KEY 标示该字段为表的主键,可以唯一的标示记录
    FOREIGN KEY 标示该字段为该表的外键
    NOT NULL     标示该字段不能为空
    UNIQUE KEY  标示该字段的值是唯一的
    AUTO_INCREMENT 标示该字段是自增长类型(数据类型为整数且是主键)
    DEFAULT    为对应的字段设置默认值
    
    
    UNSIGNED 无符号
    ZEROFILL 使用0填充

    使用方法及说明

      

    #创建一个班级,班级的id是主键且是自增长类型的,班级的名称不能为空
    
    create table class(
        id int(4)  primary key auto_increment ,
        name char(20) not null
    );
    insert into  class (name) values("中学三年二班");    #插入一条记录
    #  创建一个学生表,id为主键,自增长,姓名不能为空,性别默认男,班级编号不能为空,班级编号的外键是class表中的id,分数是无符号类型.(0-255)
    
    create table student(
        id int primary key auto_increment,
        name char(6) not null,
        sex enum("","") default "",
        class_id int(6) not null,
        foreign key(class_id) references class(id),
        score int(3) unsigned
    );
    
    insert into student (name,sex,class_id,score)values("jack","",1,75);
    外键语法:
    foreign key(要引用外键的字段) references 被引用的表名(被引用的表字段);
    注意:
      如果一个字段未设置not null,插入数据的时候,如果不给该字段传值,则默认值为NULL,如果设NOT NULL,则该字段不能为空,否则报错

    二. not null 和default  

      

    是否可空,null表示空,非字符串
    not null - 不可空
    null - 可空

     default默认值,创建列时可以指定默认值,当插入数据时如果未主动设置,则自动添加默认值

    create table tb1(id int not null defalut  2 ,num int not null)

    三. unique唯一性约束

      单列唯一,设置某一个字段的唯一性.

    -----1.单列唯一---------
    create table t2(
    id int not null unique,
    name char(10)
    );
    insert into t2 values(1,'jack');
    insert into t2 values(1,'lucy');
    #上面创建表的时候把id设置了唯一约束。那么在插入id=1,就会出错了

      联合唯一,设置多个字段组成在一起是唯一的.

    create table t20(id int not null unique auto_increment,host char(15),port int,unique(host,port));    #设置host和port字段联合唯一
    
    insert into t23(host,port) values("172.16.0.253",1990);
    insert into t23(host,port) values("172.16.0.253",1991);
    insert into t23(host,port) values("172.16.0.252",1990);
    
    # 2个字段合在一起是唯一的.

    四. primary key(主键约束)

      primary key字段的值不为空且唯一,一张表中可以做单列主键和复合主键(多列主键),但是一张表中只能有一个主键.

     1 create table t25(id int primary key auto_increment,name char(6),age int);
     2 insert into t25(name,age) values("jack",18);
     3 select * from t25;
     4 +----+------+------+
     5 | id   | name | age  |
     6 +----+------+------+
     7 |  1   | jack   |   18 |
     8 +----+------+------+
     9 
    10 #id作为自增长的主键
    单列主键
     1 create table t24(
     2     name char(10) not null,
     3     host char(15),
     4     port int,
     5     primary key(host,port)
     6 );
     7 insert into t24 values("mysql","172.168.0.253",3306);
     8 insert into t24 values("ftp","172.168.0.253",21);
     9 insert into t24 values("mysql","172.168.0.253",3306);    #插入相同的会报错
    10 #用法和unique的联合唯一差不多
    多列主键

    五. auto_increment(自增长约束)

      auto_increment有2个属性:

      1.auto_increment_increment  步长

      2.auto_increment_offset 起始偏移量

    ---------------------未设置步长和起始偏移量------------------------------
    create table t26(id int primary key auto_increment,name char(6));
    insert into t26(name) values("IT"),("HR"),("SALER");
    SELECT * FROM T26;
    +----+-------+
    | id  | name   |
    +----+-------+
    |  1  | IT       |
    |  2  | HR      |
    |  3  | SALER |
    +----+-------+
    
    --------------------------设置起始步长为100---------------------------------------
    create table t27(id int primary key auto_increment,name char(6))auto_increment=100;
    insert into t27(name) values("IT"),("HR"),("SALER");
    SELECT * FROM T27;
    +-----+-------+
    | id  | name   | 
    +-----+-------+
    | 100 | IT       |
    | 101 | HR      |
    | 102 | SALER |
    +-----+-------+
    ------------------------------设置步长和起始偏移量------------------------------------
    set session auto_increment_increment =1000;
    还是在27这张表插入一个新的值
    insert into t27 (name) values("HHH");    #HHH的编号已经是1001了
    select * from t27;
    +------+-------+
    | id   | name   |
    +------+-------+
    |  100 | IT       |
    |  101 | HR      |
    |  102 | SALER |
    | 1001 | HHH   |
    +------+-------+
    
    #设置偏移量
    set session auto_increment_offset =2;
    insert into t27(name) values ("RRR"),("PPP"),("QQQ");
    select * from t27;
    +------+-------+
    | id   | name  |
    +------+-------+
    |  100 | IT       |
    |  101 | HR      |
    |  102 | SALER |
    | 1001 | HHH   |
    | 2002 | RRR   |
    | 3002 | PPP    |
    | 4002 | QQQ   |
    +------+-------+
    
    #每增加一个值,步长都会增加1000,偏移量是2

     注意:offset的值不能大于increment的值,否则无效.

    六. 外键约束(foreign key)

      员工表里有三个字段:姓名,性别,部门.现在公司有员工20000人,3个部门.这意味着部门名称会有大量的重复数据.这时候可以使用外键来解决这个问题.先建立一个部门表.再建立员工表,把员工表中的部门ID设置为外键,来自部门表中的部门ID即可.

    开始建表,注意:一定要先建立被关联的外键表(部门表).在建立(员工表),被关联的字段必须是唯一的,要先给被关联的表插入记录.

     1 create table dep(id int primary key auto_increment,name char(15));     
     2 insert into dep(name) values("HR"),("IT"),("SALE");
     3 mysql> SELECT * FROM DEP;
     4 +----+------+
     5 | id | name |
     6 +----+------+
     7 |  1 | HR   |
     8 |  2 | IT   |
     9 |  3 | SALE |
    10 +----+------+
    11 create table emp(id int primary key auto_increment,name char(6) not null,
    12 sex enum("male","female"),depart_id int);
    13 
    14 insert into emp(name,sex,depart_id) values
    15     ("jack","male",2),
    16     ("lucy","female",1),
    17     ("lili","female",3),
    18     ("hanmeimei","female",1),
    19     ("lilei","male",2),
    20     ("erya","female",3);
    21 
    22 select * from emp;
    23 +----+--------+--------+-----------+
    24 | id | name   | sex    | depart_id |
    25 +----+--------+--------+-----------+
    26 |  1 | jack   | male       |         2 |
    27 |  2 | lucy   | female    |         1 |
    28 |  3 | lili      | female    |         3 |
    29 |  4 | hanmei | female |         1 |
    30 |  5 | lilei    | male      |         2 |
    31 |  6 | erya  | female    |         3 |
    32 +----+--------+--------+-----------+
    33 
    34 show create table empG;
    35 *************************** 1. row ***************************
    36        Table: emp
    37 Create Table: CREATE TABLE `emp` (
    38   `id` int(11) NOT NULL AUTO_INCREMENT,
    39   `name` char(6) NOT NULL,
    40   `sex` enum('male','female') DEFAULT NULL,
    41   `depart_id` int(11) DEFAULT NULL,
    42   PRIMARY KEY (`id`),
    43   KEY `depart_id` (`depart_id`),
    44   CONSTRAINT `emp_ibfk_1` FOREIGN KEY (`depart_id`) REFERENCES `dep` (`id`)
    45 ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8
    46 1 row in set (0.00 sec)
    外键约束(foreign key

    上面建立的表,有一个坏处,如果部门的id发生了变化,员工表中的部门id并不会有所改变.如果部门解散了.员工信息也不会删除.

     1 drop table emp;
     2 create table emp(id int primary key auto_increment,
     3 name char(6) not null,
     4 sex enum("male","female"),
     5 depart_id int,foreign key (depart_id) references dep(id) 
     6 on delete cascade         
     7 on update cascade);     #加上这两个语句,在部门ID发生变化时,员工表中的部门id也会跟着辩护
     8 update table dep id=101 where id=1;   #修改部门1的id
     9 select * from emp;
    10 
    11 +----+--------+--------+-----------+
    12 | id | name   | sex    | depart_id |
    13 +----+--------+--------+-----------+
    14 |  1 | jack   | male   |              2 |
    15 |  2 | lucy   | female |          101 |
    16 |  3 | lili      | female |             3 |
    17 |  4 | hanmei | female |       101 |
    18 |  5 | lilei     | male   |             2 |
    19 |  6 | erya   | female |             3 |
    20 +----+--------+--------+-----------+
    外键约束优化版
  • 相关阅读:
    linux之shell综合例子之定时任务
    linux之shell流程控制
    C#之抛异常
    C# 日期帮助类
    Aspose Excel 单元格合并后边框显示不全
    Microsoft Compatibility telemetry占cpu资源高
    js 获取年、月、周、当前日期第几周、这月有那几周
    JS 延迟加载
    EasyUI DataGrid 多级表头设置
    C#关于日期 月 天数 和一年有多少周及根据某年某周获取时间段的计算
  • 原文地址:https://www.cnblogs.com/lovepy3/p/9322666.html
Copyright © 2020-2023  润新知