zoukankan      html  css  js  c++  java
  • Mysql外键的使用

    MySQL外键(请确保数据库是innodb类型)网上有很多介绍的文章,这里我就凭自己的理解再次整理了下,废话不多说,直入正题哈.
    外键的作用:

    保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。使两张表形成关联,外键只能引用外表中列的值!

    我们来建两个表

     1 CREATE TABLE `example1` (
     2   `stu_id` int(11) NOT NULL DEFAULT '0',
     3   `name` VARCHAR(11) NOT NULL DEFAULT '',
     4   `course_id` int(11) NOT NULL DEFAULT '0',
     5   `grade` float DEFAULT NULL,
     6   PRIMARY KEY (`stu_id`,`course_id`)
     7 ) engine=INNODB;
     8 CREATE TABLE `example2` (
     9   `id` int(11) NOT NULL,
    10   `stu_id` int(11) DEFAULT NULL,
    11   `course_id` int(11) DEFAULT NULL,
    12   PRIMARY KEY (`id`),
    13   KEY `f_ck` (`stu_id`,`course_id`),
    14   CONSTRAINT `f_ck` FOREIGN KEY (`stu_id`, `course_id`) REFERENCES `example1` (`stu_id`, `course_id`)
    15 ) engine=INNODB;
    16 insert into example1 (stu_id,name,course_id,grade)values(1,'baidu',1,97.5),(2,'google',2,89);
    17 insert into example2 (id,stu_id,course_id)values(1,1,1),(2,2,2); 

    example1表,里面包含stu_id学号,name姓名,course_id课程号,grade分数

    example2表,里面包含id,stu_id学号,course_id课程号,然后建立外键

    分别插入数据到两个表中。

    我们把example2中的stu_id和course_id称为example2表的外键,example1是父表,example2是子表,两个表形成关联,必须子表的数据删除后,才能删除父表中的对应数据

    现在我们来删除example1中的一条数据:

    因为example2中的数据关联了example1的数据,这样是删不了的,达到了外键的作用.

    然后我们来先删除example2表中的数据,再删除example1表中的数据

    这样就成功了;

    事件触发限制: 

    on delete和on update , 可设参数cascade(跟随外键改动), restrict(限制外表中的外键改动),set Null(设空值),set Default(设默认值),[默认]no action

    我们来看看事件触发限制是干啥的。。。

    我们先删除外键,然后重新建立外键带上事件触发限制

    alter table example2 drop foreign key f_ck;
    alter table example2 add CONSTRAINT `f_ck` FOREIGN KEY (`stu_id`, `course_id`) REFERENCES `example1` (`stu_id`, `course_id`) ON DELETE CASCADE ON UPDATE CASCADE;

    我们先看下数据:

    再来修改example1表中的数据看看

    update example1 set stu_id=3,course_id=3 where stu_id=1;

    再来查看数据:

    发现没,example1和example2中的stu_id和course_id都变成了3。

    我们在来删除example1表中的数据

    delete from example1 where stu_id=3;

    会发现可以删除,而且example2子表中的数据也没有了。

  • 相关阅读:
    深入理解C++右值引用
    并发编程的原子性和顺序性
    LLVM简介
    APK及相关的Android路径
    UE4资源移动与跨项目迁移
    OpenGL简介
    IDEA无限试用插件
    使用idea搭建springcloud
    .NET Core 微服务架构 Steeltoe 使用(基于 Spring Cloud)
    微服务:注册中心ZooKeeper、Eureka、Consul 、Nacos对比
  • 原文地址:https://www.cnblogs.com/phpper/p/8978685.html
Copyright © 2011-2022 走看看