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

相关推荐
不是起点的终点4 分钟前
【实战】Python 一键生成数据库说明文档(对接阿里云百炼 AI,输出 Word 格式)
数据库·python·阿里云
2301_813599552 小时前
Go语言怎么做秒杀系统_Go语言秒杀系统实战教程【实用】
jvm·数据库·python
NCIN EXPE7 小时前
redis 使用
数据库·redis·缓存
MongoDB 数据平台7 小时前
为编码代理引入 MongoDB 代理技能和插件
数据库·mongodb
极客on之路7 小时前
mysql explain type 各个字段解释
数据库·mysql
代码雕刻家7 小时前
MySQL与SQL Server的基本指令
数据库·mysql·sqlserver
lThE ANDE7 小时前
开启mysql的binlog日志
数据库·mysql
yejqvow127 小时前
CSS如何控制placeholder文字的颜色_使用--placeholder伪元素
jvm·数据库·python
oLLI PILO7 小时前
nacos2.3.0 接入pgsql或其他数据库
数据库
m0_743623927 小时前
HTML怎么创建多语言切换器_HTML语言选择下拉结构【指南】
jvm·数据库·python