MYSQL数据库 主键,外键,表关系

564 阅读3分钟

约束条件

主键

  • 一. 主键设置
    • 主键设置关键字 primary key
      create table t1(
          id int primary key,                
          name varchar(32)
      );
      
      1. 从约束角度看主键等价于非空且唯一
              #   not null unique
      
      1. InnoDB引擎规定一张表只能有一个主键
      1. 如果创建的表没有设置主键,非空且唯一的字段会被默认设为主键.
             非空且唯一的字段也没有, InnoDB会将隐藏的字段最为主键
                 id int not null unique
      2. 主键可以加快数据查询
      3. 创建表的时候都需要有id字段,并且id字段应设为主键
             (uid,id,pid等id,名字代表id就可)       
      4. 单列主键     
             id int primary key           
      5. 联合主键
             id1 int,id1 int,primary key(id1,id2)
      
  • 二. 主键自增
      1. 自增设置关键字 auto_increment
      1. 主键的自增作为约束条件要跟在键的后面,无法单独使用
           # 使用方式
      create table t(
          id int primary key auto_increment,
         	name varchar(32)
      );
      
      1. 自增的特点
      在删除数据时,自增操作不会回退与重置,想要重置主键,需要对表格式化
         truncate 表名;  # 删除表数据并重置主键值  
      

外键

    1. 外键字段专门用于记录表与表之间的数据关系
       # 数据的关系有四种
            1. 一对一的关系
            2. 一对多的关系
            3. 多对多的关系
            4. 没有关系
    对于表关系如何判定呢: 换位思考他们的关系几对几
    
    1. 关于外键的创建位置
    1. 针对'一对多'的关系,外键字段建在多的一方 
    2. 针对'多对多'的关系,外键需要开设第三张关系表存储数据关系
    3. 针对'一对一'的关系,外键可以建在任何一方,但是一般选择建在查询频率较高的表
    

表关系

  • 外键设置关键字 foreign key
  • 必须基于多张表的创建才能设置表关系

一对多

  • 创建一对多的表关系数据
    1.先写普通字段
    2.然后再写外键字段   
      create table dep(
          id int primary key auto_increment,
          dep_name varchar(32),
          dep_desc varchar(32)
      );
      create table emp(
          id int primary key auto_increment,
          name varchar(32),
          gender enum('male','female','others') default 'male',
          dep_id int,
          foreign key(dep_id) references dep(id)
      );
    
    
    • 实操
        1. 创建表的时候需要先创建没有外键的表,然后是有外键的表
          image.png
        1. 插入表数据的时候,外键字段只能写关联表字段里的数据值
          image.png
        1. 被关联字段的操作限制性太强,无法进行修改与删除
          image.png image.png
  • 怎么解决这些问题呢?
    • 级联更新,级联删除
      on update cascade  # 级联更新 
      on delete cascade  # 级联删除
      
      • 被关联数据一旦变动,关联的数据同步变动
        create table emp1(
        id int primary key auto_increment,
        name varchar(32),
        gender enum('male','female','others') default 'male',
            dep_id int,
            foreign key(dep_id) references dep1(id) 
            on update cascade  
            on delete cascade  
        ); 
        create table dep1(
            id int primary key auto_increment,
            dep_name varchar(32),
            dep_desc varchar(32)
        );
        
  • 扩展
    在实际工作中,很多时候可能并不会使用外键
          因为外键增加了表之间的耦合度 不便于单独操作 资源消耗增加
    我们为了能够描述出表数据的关系,又不想使用外键
          自己通过写SQL,建立代码层面的关系
    

多对多

  • 创建多对多的表关系数据
    • 不能直接创建,需要单独开设第三张关系表。存储数据关系
      image.png
    • 正确步骤
      create table book(
          id int primary key auto_increment,
          title varchar(32)
      );
      create table author(
          id int primary key auto_increment,
          name varchar(32)
      );
      create table bookauthor(
          id int primary key auto_increment,
          book_id int,
          foreign key(book_id) references book(id) 
          on update cascade  # 级联更新 
          on delete cascade, # 级联删除
          author_id int,
          foreign key(author_id) references author(id) 
          on update cascade  # 级联更新 
          on delete cascade  # 级联删除
       );
      
    • 实际操作 image.png

一对一

  • 创建一对一的表关系数据
    • 正确步骤
    create table userDetail(
        id int primary key auto_increment,
        phone bigint
    );
    create table user(
        id int primary key auto_increment,
        name varchar(32),
        detail_id int unique,
        foreign key(detail_id) references userDetail(id) 
        on update cascade  
        on delete cascade  
    );
    
    • 实际操作 image.png image.png