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. 实现:建立三方表,中间表来包含两个表的主键(需要创建中间表)

相关推荐
Ai 编码助手1 小时前
MySQL中distinct与group by之间的性能进行比较
数据库·mysql
陈燚_重生之又为程序员2 小时前
基于梧桐数据库的实时数据分析解决方案
数据库·数据挖掘·数据分析
caridle2 小时前
教程:使用 InterBase Express 访问数据库(五):TIBTransaction
java·数据库·express
白云如幻2 小时前
MySQL排序查询
数据库·mysql
萧鼎2 小时前
Python并发编程库:Asyncio的异步编程实战
开发语言·数据库·python·异步
^velpro^2 小时前
数据库连接池的创建
java·开发语言·数据库
苹果醋32 小时前
Java8->Java19的初步探索
java·运维·spring boot·mysql·nginx
荒川之神2 小时前
ORACLE _11G_R2_ASM 常用命令
数据库·oracle
IT培训中心-竺老师2 小时前
Oracle 23AI创建示例库
数据库·oracle
小白学大数据2 小时前
JavaScript重定向对网络爬虫的影响及处理
开发语言·javascript·数据库·爬虫