数据库——完整性约束(7)

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

作用:用于保证数据的完整性和一致性

  • not null 与 default
    • not null :标识该字段不能为空
    • default:为该字段设置默认值
  • unique:标识该字段的值是唯一的,不能重复
    • 添加unique的两种方式
    •  联合唯一
  • primary key  标识该字段为该表的主键,可以唯一的标识记录,not null unique
    • 对于innodb存储引擎来说,一张表必须有一个主键
    • 单列主键(三种方式)
    • 方式一:not null + unique
    • 方式二:在某一个字段后用primary key
    • 方式三:在所有字段后单独定义primary key
    • 复合主键
  • auto_increment :标识该字段的值自动正常(整数类型,而且为主键)
    • 约束字段为自动增长,被约束的字段必须同时被key约束
    • 默认从1开始自增
    • 清空表
      • delete from 表名;
        • 对于自增的字段,在用delete删除后,再插入值,该字段仍然安装删除前的位置继续增长
      • truncate 表名
        • 用truncate 清空表后,自增字段会重新从1开始自增;
      • 清空表通常用truncate,delete通常和where一起用
    • 查询自增步长
      • show variables like 'auto_inc%';
      • 步长:auto_increment_increment   默认为1
      • 起始偏移量:auto_increment_offset  默认为1
    • 设置步长
      • set session auto_increment_increment = 5;本次连接的
      • set global auto_increment_increment = 5;全局的
    • 设置起始偏移量
      • set global auto_increment_offset=3;
      • 强调:起始偏移量<=步长
  • foreign key :标识该字段为该表的外键
    • 用来建立表之间的关系
    • #表类型必须是innodb存储引擎,且被关联的字段,即references指定的另外一个表的字段,必须保证唯一
      create table department(
      id int primary key,
      name varchar(20) not null
      )engine=innodb;
      
      #dpt_id外键,关联父表(department主键id),同步更新,同步删除
      create table employee(
      id int primary key,
      name varchar(20) not null,
      dpt_id int,
      constraint fk_name foreign key(dpt_id)
      references department(id)
      on delete cascade
      on update cascade 
      )engine=innodb;
      
      
      #先往父表department中插入记录
      insert into department values
      (1,'欧德博爱技术有限事业部'),
      (2,'艾利克斯人力资源部'),
      (3,'销售部');
      
      
      #再往子表employee中插入记录
      insert into employee values
      (1,'egon',1),
      (2,'alex1',2),
      (3,'alex2',2),
      (4,'alex3',2),
      (5,'李坦克',3),
      (6,'刘飞机',3),
      (7,'张火箭',3),
      (8,'林子弹',3),
      (9,'加特林',3)
      ;
      
      
      #删父表department,子表employee中对应的记录跟着删
      mysql> delete from department where id=3;
      mysql> select * from employee;
      +----+-------+--------+
      | id | name  | dpt_id |
      +----+-------+--------+
      |  1 | egon  |      1 |
      |  2 | alex1 |      2 |
      |  3 | alex2 |      2 |
      |  4 | alex3 |      2 |
      +----+-------+--------+
      
      
      #更新父表department,子表employee中对应的记录跟着改
      mysql> update department set id=22222 where id=2;
      mysql> select * from employee;
      +----+-------+--------+
      | id | name  | dpt_id |
      +----+-------+--------+
      |  1 | egon  |      1 |
      |  3 | alex2 |  22222 |
      |  4 | alex3 |  22222 |
      |  5 | alex1 |  22222 |
      +----+-------+--------+
      示例
    • 如何找出两张表之间的关系
    • 分析步骤:
      #1、先站在左表的角度去找
      是否左表的多条记录可以对应右表的一条记录,如果是,则证明左表的一个字段foreign key 右表一个字段(通常是id)
      
      #2、再站在右表的角度去找
      是否右表的多条记录可以对应左表的一条记录,如果是,则证明右表的一个字段foreign key 左表一个字段(通常是id)
      
      #3、总结:
      #多对一:
      如果只有步骤1成立,则是左表多对一右表
      如果只有步骤2成立,则是右表多对一左表
      
      #多对多
      如果步骤1和2同时成立,则证明这两张表时一个双向的多对一,即多对多,需要定义一个这两张表的关系表来专门存放二者的关系
      
      #一对一:
      如果1和2都不成立,而是左表的一条记录唯一对应右表的一条记录,反之亦然。这种情况很简单,就是在左表foreign key右表的基础上,将左表的外键字段设置成unique即可
      分析步骤
    • 建立表之间的关系
  • unsigned:无符号型
  • zerofill:填充零
posted @ 2018-03-12 12:53  GraceZen  阅读(293)  评论(0编辑  收藏  举报