博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql外键的使用
阅读量:6509 次
发布时间:2019-06-24

本文共 1709 字,大约阅读时间需要 5 分钟。

一早就知道有mysql有外键这回事,但是貌似平时的项目中用到的并不多,以至于我没有去研究过这个东西,也不知道该怎么用。当然也不清楚对性能的影响。这篇文章先搞清楚外键的作用。

首先来添加一张表,做为测试要用的一张参考表。

CREATE TABLE `user` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `name` varchar(255) DEFAULT NULL,  `sex` tinyint(4) DEFAULT NULL,  `create_time` datetime DEFAULT NULL,  PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

接着建一张包含外键的表。

CREATE TABLE `user_article` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `user_id` int(11) DEFAULT NULL,  `content` varchar(255) DEFAULT NULL,  `create_time` datetime DEFAULT NULL,  `modify_time` datetime DEFAULT NULL,  PRIMARY KEY (`id`),  KEY `user_id` (`user_id`),  CONSTRAINT `user_article_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

接着就测试一下外键的作用。分别在user表和user_article表创建一点数据。

user表
id name sex create_time
1 admin 1 2016-09-08 16:36:55
2 xiaoming 2 2016-09-08 16:37:07
user_article表
id user_id content create_time modify_time
1 1 hello word 2016-09-08 16:39:11 NULL

现在目的是要保持user表和user_article表的数据完整性,所以在删除user的时候,如果user_article存在数据的话,那么禁止删除。user表和user_article表是通过user_id关联的。在建表的时候就已经为user_article表的user_id字段建立了外键,参考栏位就是user表的id,更新和删除时选项都为 RESTRICT。

现在我运行删除语句 delete from user where id=1;会报如下错误:

Cannot delete or update a parent row: a foreign key constraint fails (`test`.`user_article`, CONSTRAINT `user_article_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`))

因为在user_article中存在user_id为1的数据,所以这里禁止参考表删除这条数据。

更新和删除时的选项可以根据自己的实际情况进行修改,下面是更新和修改时的触发机制:

on delete和on update , 可设参数:
  • cascade(跟随外键改动)

  • restrict(限制外表中的外键改动)

  • set Null(设空值)

  • set Default(设默认值)

  • no action [默认]

具体的使用还需要自己多测试多使用就能理解了,其实外键也不难搞懂,只是接触的少了。平时的代码中实现这一类逻辑基本是用代码去实现的,所以一般不会用到外键。那么外键的优势和劣势在哪里,这个估计要亲身体验才能知道了吧,

转载地址:http://cydfo.baihongyu.com/

你可能感兴趣的文章
【HM】第4课:MySQL入门
查看>>
GNS3-地址重叠环境中部署IPsec
查看>>
exchange online 用户疑问之许可证和用户数据归档
查看>>
QImage Mat IplImage 之间的相互转换
查看>>
lsof命令详解
查看>>
使用eclipse与android studio 在开发自定义控件时的区别
查看>>
我的友情链接
查看>>
mysql学习笔记
查看>>
django 问题解决
查看>>
年年有鱼游戏Android源码项目
查看>>
java使用Iterator、for循环同步数据
查看>>
创建镜像iso文件
查看>>
Linux下创建软RAID5和RAID10实战
查看>>
mariadb的日志
查看>>
C++类的存储
查看>>
2015 年最受欢迎的 7 个系统监控工具
查看>>
ActiveReports 报表应用教程 (8)---交互式报表之动态过滤
查看>>
解决使用Handler时Can't create handler inside thread that has not called Looper.prepare()
查看>>
跟我一起学docker(四)--容器的基本操作
查看>>
磁化强度
查看>>