zoukankan      html  css  js  c++  java
  • 数据库——完整性约束(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:填充零
  • 相关阅读:
    李彦宏演讲被泼水:演讲时遇到意外情况该如何处理?
    人工智能,能为教育带来哪些改变?
    重磅!Python又第一了!网友:为什么找不到好工作?真相让人脸红…
    《营销管理必读12篇》读后感
    战略管理好书推荐,《战略管理必读12篇》位居榜首
    企业管理十大书
    童话里都是骗人的?用词向量解析故事中的性别偏见
    《领导力必读12篇》:领导力提升的艺术
    领导力提升:你找对方法了吗?
    分布式系统阅读笔记(十)-----P2P对等网络系统
  • 原文地址:https://www.cnblogs.com/GraceZ/p/8451881.html
Copyright © 2011-2022 走看看