设为首页 收藏本站
查看: 927|回复: 0

[经验分享] 补12.关于mysql的外键约束

[复制链接]

尚未签到

发表于 2018-10-9 07:02:12 | 显示全部楼层 |阅读模式
  一、什么是mysql中的外键(froeign key)
  假如说有两张表,其中一张表的某个字段指向了另一张表的主键,这就可以称之为外键(froeign key)。
  在子表中增加一条记录时,需要确定是否有与父表相对应的记录。
  如果父表没有对应的记录,那么子表(从表)无法插入这条数据。
  下面是一个关于外键的示例:
  1.首先创建一个主表,这个主表存放了班级信息。

  create table>  2.在class表中插入五条记录,代表有5个班级。

  insert into>  3.创建一个子表,这个子表存放了学生和班级的对应关系,这些学生属于哪个班级?

  create table student(>  4.插入6条记录,代表了6个学生。
  insert into student(id,name,class_id) value (1,"stu1",2),(2,"stu2",2),(3,"stu3",1),(4,"stu4",3),(5,"stu5",1),(6,"stu6",4);
  现在的规则是,一个班级可以对应多个学生,但是一个学生只能属于一个班级。
  5.增加外键约束。
  接下来,为student表增加一个外键约束。

  alter table student add constraint cls_stu foreign key(class_id) references>  #约束字段以class表的id字段为主。
  6.测试外键约束是否生效。
  刚刚我们创建的class班级表中一共有5个记录,也就是五个班级。(分别是class1~class5)
  现在学生表中,新增一个学生,这个学生属于一个class表中不存在的班级,班级6,看看会是什么效果:
  mysql> insert into student(id,name,class_id)value(7,"stu7",6);
  ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`db_1`.`student`, CONSTRAINT `cls_stu` FOREIGN KEY (`class_id`) REFERENCES `class` (`id`))
  无法添加这个记录,这说明了,student表的class_id字段,已经受class表的id字段的约束,当class表的id字段没有这个id时,student表无法插入这条记录。
  7.删除一个表的外键约束。
  ALTER TABLE student DROP FOREIGN KEY 【外键名称】
  例:
  alter table student drop foreign key cls_stu;
  8.innodb引擎支持的一些关于外键的操作。
  #当一个表被设置了外键约束,如果在父表中找不到候选键,则不允许在子表上进行insert/update操作。
  # 注意!!!在父表上进行update/delete以更新或删除在子表中有一条或多条对应匹配行的候选键时,父表的行为取决于:在定义子表的外键时指定的on update或on delete子句!!!
  #下面是innodb引擎所支持的常见的四种方式:
  8.1cascade方式 在父表上update/delete记录时,同步update/delete掉子表的匹配记录
  外键的级联删除:如果父表中的记录被删除,则子表中对应的记录自动被删除

  alter table student add constraint cls_stu foreign key(class_id) references>  #级联删除或更改,当父表外键位置做出修改,或者删除,子表更改或删除完全取决于 on delete或者on update,当然,这两个关键字是可以同时出现的!!!
  下面是一个级联删除关键字的示例:

  alter table student add constraint cls_stu foreign key(class_id) references>  8.2 set null方式 在父表上update/delete记录时,将子表上匹配记录的列设为null。
  例:

  alter table student add constraint cls_stu foreign key(class_id) references>  8.3 Restrict方式 :拒绝对父表进行删除更新操作(不常用)。
  8.4 No action方式 在mysql中同Restrict,如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作(了解)
  9.关于外键的一些补充:
  设置级联操作:
  在主表数据发生改变时,与之关联的从表数据应该如何处理
  使用关键字:
  on update
  on delete
  来标识
  允许的级联动作:
  cascade关联操作,如果主表被更新或删除,从表也会执行相应的操作
  set null,表示从表数据不指向主表任何记录
  restrict:拒绝主表的相关操作
  alter table t_student add foreign key (class_id) references t_class (class_id)
  on delete set null; # 在删除外键时,将从表的外键值设置为null
  修改外键:
  先删除这个表的外键,然后再增加
  alter table tb_name drop froeign key 外键名称
  外键名称在建立外键时可以自定义名称,如果不自定义,会按照mysql自动生成一个名称
  show create table tb_name;


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-618193-1-1.html 上篇帖子: 偶学处理mysql死锁 下篇帖子: 源码安装nginx、mysql的注意事项
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表