zoukankan      html  css  js  c++  java
  • MySQL外键的作用和创建

    MySQL外键的作用:

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

    我们来建两个表

    CREATE TABLE `example1` (
      `stu_id` int(11) NOT NULL DEFAULT '0',
      `course_id` int(11) NOT NULL DEFAULT '0',
      `grade` float DEFAULT NULL,
      PRIMARY KEY (`stu_id`,`course_id`)
    );
    CREATE TABLE `example2` (
      `id` int(11) NOT NULL,
      `stu_id` int(11) DEFAULT NULL,
      `course_id` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `f_ck` (`stu_id`,`course_id`),
      CONSTRAINT `f_ck` FOREIGN KEY (`stu_id`, `course_id`) REFERENCES `example1` (`stu_id`, `course_id`)
    );
    insert into example1 (stu_id,course_id,grade)values(1,1,98.5),(2,2,89);
    insert into example2 (id,stu_id,course_id)values(1,1,1),(2,2,2);

    我们建了

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

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

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

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

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

    delete from example1 where stu_id=2;

    会发现报错

    ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`test`.`example3`, CONSTRAINT `f_ck` FOREIGN KEY (`stu_id`, `course_id`) REFERENCES `example2` (`stu_id`, `course_id`))

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

     

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

    delete from example2 where stu_id=2;

    delete from example1 where stu_id=2;

    这样就成功了;


     

    事件触发限制: 

    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;

    我们先查看一下数据

    mysql> select * from example1;select * from example2;

    +--------+-----------+-------+

    | stu_id | course_id | grade |

    +--------+-----------+-------+

    |      1 |         1 |  98.5 |

    +--------+-----------+-------+

    1 row in set (0.00 sec)

    +----+--------+-----------+

    | id | stu_id | course_id |

    +----+--------+-----------+

    |  1 |      1 |         1 |

    +----+--------+-----------+

    1 row in set (0.00 sec)

    这时example1和example2中的stu_id和course_id都是1,

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

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

    再来查看数据

    mysql> select * from example1;select * from example2;

    +--------+-----------+-------+

    | stu_id | course_id | grade |

    +--------+-----------+-------+

    |      3 |         3 |  98.5 |

    +--------+-----------+-------+

    1 row in set (0.00 sec)

    +----+--------+-----------+

    | id | stu_id | course_id |

    +----+--------+-----------+

    |  1 |      3 |         3 |

    +----+--------+-----------+

    1 row in set (0.00 sec)

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

     

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

    delete from example1 where stu_id=3;

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


     

    其实啊,外键就这个作用,保持数据一致性,完整性,是不让改还是一起改,由事件触发器决定;

    有个疑问一直不明白【外键别名到底有什么用】,知道的大神麻烦告知,谢谢

    今天问了公司几个大神,他们给的答案是,外键都很少用,这个更不懂(暗自窃喜中,哈哈)

     

  • 相关阅读:
    MySQL基础之第9章 触发器
    Windows系统安装————windows7 企业版 无法安装 NET.framework4.52-4.6版本在WIN7下解决办法
    流媒体技术学习笔记之(十二)Linux(Ubuntu)环境运行EasyDarwin
    流媒体服务器之————EasyDarwin开源流媒体服务器:编译、配置、部署
    流媒体技术学习笔记之(十一)Windows环境运行EasyDarwin
    流媒体技术学习笔记之(十)HLS协议直播延时优化(35s到10S)
    流媒体技术学习笔记之(九)减少VLC 延迟的方法
    流媒体技术学习笔记之(八)海康、大华IpCamera RTSP地址和格式
    流媒体技术学习笔记之(七)进阶教程OBS参数与清晰度流畅度的关系
    Phalcon框架之———— 2.0升级到3.0 问题Model验证问题解决
  • 原文地址:https://www.cnblogs.com/xiaozong/p/5682589.html
Copyright © 2011-2022 走看看