MySQL——约束条件

MySQL——约束条件

目录

  • 约束条件——主键
  • 约束条件——外键

约束条件——主键

  • primary key主键

    1. 单从约束角度上而言主键等价于非空且唯一 not null unique

      create table t1(
          id int primary key,
          name varchar(32)
      ); 
      
    2. InnoDB存储引擎规定一张表必须有且只有一个主键

    2.1. 如果创建的表中没有主键也没有非空且唯一的字段 那么InnoDB存储引擎会自动采用一个隐藏的字段作为主键(主键可以加快数据查询:新华字典的目录)
    
    2.2.如果创建的表中没有主键但是有非空且唯一的字段 那么InnoDB存储引擎会自动将该字段设置为主键
    
    ~~~python
    create table t2(
        nid int not null unique,
        sid int not null unique,
        uid int not null unique,
        name varchar(32)
    ); 
    ~~~
    
    1. 创建表的时候都应该有一个'id'字段 并且该字段应该作为主键
    ​	如:uid、sid、pid、gid、cid、id
    
    1. 单列主键和联合主键
    针对主键有且只有一个主键从而产生
    
    |   主键   |                   表示                    |
    | :------: | :---------------------------------------: |
    | 单列主键 |            id int primary key             |
    | 联合主键 | sid int,nid int,<br>primary key(sid, nid) |
    
    联合主键也是属于单列主键的,同样符合有且只有一个主键
    
  • auto_increment自增

    1. 该约束条件不能单独使用 必须跟在键后面(主要配合主键一起使用)

      create table t3(
          id int auto_increment
      );
      there can be only one auto column and it must be defined as a key
      create table t4(
          id int primary key auto_increment,
          name varchar(32)
      );
      
    2. 自增的特点

      自增的操作不会因为执行删除数据的操作而回退或者重置

      如果非要重置主键 需要格式化表

      操作 方法
      删除数据 delete from
      格式化数据 truncate 表名;

      删除表的数据并不是删除主键值,而格式化数据在删除表的同时也将该表的主键值也删除

约束条件——外键

  • 外键简介

    1.外键的含义

    ​ 外键与主键相对,作用就是通过主外键的之间关系使对张表中的数据更好的关联。

    2.外键的特点

    ​ 从表 外键 的值是对主表 主键 的引用。

    ​ 从表外键类型,必须与主表主键类型一致。

    3.外键的作用

    ​ 主键可以引用外键来保证数据的完整性和一致性

    ​ 具体可以理解为

    ​ 用外键来承接一个表,让主表可以引用外键的表来达到数据的完整性

  • 外键字段的创建

    1.什么是外键字段

    ​ 外键字段是用来记录表与表之间数据的关系

    2.数据之间的关系

    ​ 一对多、多对多、一对一、没有关系

    3.表数据关系的判定

    ​ 要懂得换位思考

    表关系 判断 事例 外键字段的建立
    一对多 一个属于另一个
    另一个不属于这个
    一个学生对一个教室
    一个教室可以有多个学生
    建在多的一方
    多对多 二者都可属于另一个 一个学生被多个老师教授
    一个教师教授多个学生
    建在单独
    开设的第三个表
    一对一 二者都不属于另一个 一个学生对应一个学号
    一个学号只能对应一个学生
    建在任意表
    建议建在查询率高
    没得关系 二者无关系 一个学生和另一个学校
    (学生与所在的学校有关系,
    但与其他学校没关系)
    NULL
  • 外键(Foreign Key)

    1.表中存在外键的时候,写sql语句时的顺序

    ​ (1)先写普通字段

    ​ (2)然后再写 外键字段

    2.编写普通字段

    举例一对多:
    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)
        
    );
    
    
    create table dep(
    	id int primary key auto_increment,
       	dep_name varchar(32),
        dep_desc varchar(32)
    );
    

    (1)创建表的时候需要先创建被关联的表(没有外键) 然后再是关联表(有外键)
    (2)插入表数据的时候 针对外键字段只能填写被关联表字段已经出现过的数据值
    (3)被关联字段无法修改和删除

    3.关联表

    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)
    );
    

    级联更新、级联删除
    被关联数据一旦变动 关联的数据同步变动

    4.实际情况中外键的情况

    ​ 在实际工作中 很多时候可能并不会使用外键
    ​ 因为外键增加了表之间的耦合度 不便于单独操作 资源消耗增加
    ​ 我们为了能够描述出表数据的关系 又不想使用外键
    ​ 自己通过写SQL 建立代码层面的关系

  • 表关系之多对多

    针对多对多表关系 外键字段不能建在任意一方!!!

    所以,需要单独开设第三张关系表 存储数据关系

    create table book(
        id int primary key auto_increment,
        title varchar(32),
        author_id int,
        foreign key(author_id) references author(id) 
        on update cascade  # 级联更新 
        on delete cascade  # 级联删除
    );
    create table author(
        id int primary key auto_increment,
        name varchar(32),
        book_id int,
        foreign key(book_id) references book(id) 
        on update cascade  # 级联更新 
        on delete cascade  # 级联删除
    );
    

    开设第三张关系表 存储数据关系

    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 book2author(
        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  # 级联删除
    );
    
  • 表关系之一对一

    针对'一对一'的表关系 外键字段建在任何一张表都可以 但是建议你建在查询频率较高的表中便于后续查询

       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  # 级联删除
       );
    	create table userDetail(
        	id int primary key auto_increment,
           phone bigint
        );
    

    ​ 一对一的关系需要考虑确定数据之间关系的唯一性 unique

posted @   Nirvana*  阅读(57)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示