MySQL_约束、多表关系

约束

  1. 概念:就是用来作用表中字段的规则,用于限制存储在表中的数据。

  2. 目的:保证数据库中数据的正确性,有效性和完整性。

  3. 约束演示

    #定义一个学生表,表中要求如下:
    #sn 表示学生学号,要求使用 int 类型,主键并且自动递增;
    #name 表示姓名,不为空;
    #age 表示年龄,18-30岁之间;
    #gender 表示性别;
    #study_status 表示学习状态,0表示挂科,1表示通过,默认是 1
    ​
    CREATE TABLE student(
        sn int AUTO_INCREMENT  PRIMARY KEY,
        name varchar(10) not null,
        age int check(age >= 18 && age <=30),
        gender char(1),
        study_status TINYINT DEFAULT 1
    ​
    )COMMENT '学生表';
    ​
    SELECT * FROM student;
    ​
    #添加一点学生数据
    insert into student (name,age,gender,study_status) values('sy',18,'男',1);
    insert into student (name,age,gender,study_status) values('sy',18,'男',1);
    insert into student (name,age,gender,study_status) values(null,18,'男',1);
    insert into student (name,age,gender,study_status) values('sy',31,'男',1);
    insert into student (name,age,gender) values('werewr',30,'男');
    

外键约束

  1. 概念:用户建立两张表之间的联系的,为了保证数据的一致性和完整性的。

  2. 注意上面创建的时候没有使用外键真正的来管理数据,可能会存在数据的丢失

  3. 添加外键(主表就是数据不能随意改变的表)

    1.创建表创建外键
    CREATE TABLE 表名( 
        字段名 数据类型, ... 
        [CONSTRAINT] [外键名称] FOREIGN KEY (外键字段名) REFERENCES 主表 (主表列名)
     );
    ​
    2.添加外键
        ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名) REFERENCES 主表 (主表列名) ;
    
    • 案例:为emp表的dept_id字段添加外键约束,关联department表的主键id

      alter table emp add constraint fk_emp_dept_id FOREIGN key (dept_id) REFERENCES department(id);
      
  4. 删除外键

    ALTER TABLE 表名 DROP FOREIGN KEY 外键名称; 
    
    • 案例:删除刚才添加的外键

      ALTER TABLE emp DROP FOREIGN KEY fk_emp_dept_id; 
      
  5. 删除更新外键

    • 添加了外键之后尼,再删除父表数据时产生约束行为,就称为删除和更新行为。

    • 语法

      ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段) REFERENCES 主表名 (主表字段名) ON UPDATE CASCADE ON DELETE CASCADE;
      
    • 案例:CASCADE(父表会删除或者更新子表中的外键数据)

      ALTER TABLE emp add constraint fk_emp_dept_id FOREIGN KEY (dept_id) REFERENCES department(id)
      on update cascade on delete cascade;
      
    • 案例:SET NULL

      ALTER TABLE emp add constraint fk_emp_dept_id FOREIGN KEY (dept_id) REFERENCES department(id)
      ON UPDATE SET NULL ON DELETE SET NULL;
      

一对一关系

  1. 用户和用户详情

  2. 关系:一对一的关系

  3. 用途:用于单表拆分,将一张表的基础字段放在一张表中,其它字段放在另一张表中,可以提升查询效率

  4. 实现:在任意一张表里面添加外键,关联另一张表的主键

    CREATE TABLE `user_detail` (
      `id` int NOT NULL AUTO_INCREMENT,
      `university` varchar(255) DEFAULT NULL,
      `car` varchar(255) DEFAULT NULL,
      `hourse` varchar(255) DEFAULT NULL,
      `user_id` int NOT NULL UNIQUE, // 唯一约束
      PRIMARY KEY (`id`) USING BTREE,
      KEY `u_id` (`user_id`),
      CONSTRAINT `u_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
    

一对多关系

  1. 案例:部门和员工关系

  2. 关系:一个部门对应多个员工,一个员工对应一个部门

  3. 实现:在多的一方建立外键,指向一的一方的主键

多对多的关系

  1. 案例:角色和菜单的关系,学生和老师

  2. 关系:一个学生可以有多个老师,一个老师可以有多个学生

  3. 实现:建立三方表,中间表来包含两个表的主键(需要创建中间表)

相关推荐
酷炫码神12 分钟前
MySQL查询
数据库·mysql
大明湖的狗凯.14 分钟前
MySQL 中的排序:索引排序与文件排序
数据库·mysql·oracle
XMYX-022 分钟前
深入解析 Django 中数据删除的最佳实践:以动态管理镜像版本为例
数据库·django·sqlite
Lostgreen25 分钟前
SQL on Hadoop
数据库·hadoop·笔记·分布式·sql·学习
Karoku0661 小时前
【docker集群应用】Docker常用命令
运维·数据库·docker·容器
小小宇宙中微子1 小时前
MySQL INSERT CRTATE DELETE DORP UPDATE WHERE 的用法
数据库·mysql
没有黑科技1 小时前
网上蛋糕售卖店管理系(Java+SpringBoot+MySQL)
java·spring boot·mysql
swiftlzk1 小时前
redmi 12c 刷机
android·数据库
人才程序员2 小时前
详解Qt 中使用虚拟键盘(软键盘qtvirtualkeyboard)
开发语言·数据库·c++·qt·计算机外设·界面·c语音
打你个大西瓜️3 小时前
单片机知识总结(完整)
数据库·单片机·mongodb