当前位置: 首页 > news >正文

mysql外键的使用

一早就知道有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表
idnamesexcreate_time
1admin12016-09-08 16:36:55
2xiaoming22016-09-08 16:37:07
user_article表
iduser_idcontentcreate_timemodify_time
11hello word2016-09-08 16:39:11NULL

现在目的是要保持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 [默认]

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

相关文章:

  • 08.Switch的使用方法
  • Python学习笔记11—函数
  • iOS - AppStores App 上架
  • 从输入 URL 到浏览器接收的过程中发生了什么事情
  • java设计模式类图大全
  • Spark Streaming 的玫瑰与刺
  • CentOS 6.4下Squid代理服务器的安装与配置
  • 0909滴滴面试小结
  • Mongodb 利用mongoshell进行数据类型转换
  • pom.xml标签以及maven在Idea使用
  • Android 样式和主题(style theme)
  • Linux作业7
  • 判断终端是ios还是安卓的一些妙用(附加微信分享图标修改)
  • 4: Accessing Environment Variables(Working with programs)
  • flat network 原理与配置 - 每天5分钟玩转 OpenStack(86)
  • 【5+】跨webview多页面 触发事件(二)
  • angular学习第一篇-----环境搭建
  • Babel配置的不完全指南
  • CSS 专业技巧
  • CSS实用技巧干货
  • Flex布局到底解决了什么问题
  • node学习系列之简单文件上传
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • 反思总结然后整装待发
  • 配置 PM2 实现代码自动发布
  • 让你的分享飞起来——极光推出社会化分享组件
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 最简单的无缝轮播
  • MPAndroidChart 教程:Y轴 YAxis
  • 国内开源镜像站点
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #100天计划# 2013年9月29日
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (07)Hive——窗口函数详解
  • (3)nginx 配置(nginx.conf)
  • (poj1.2.1)1970(筛选法模拟)
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (多级缓存)多级缓存
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • ***原理与防范
  • .NET Core Web APi类库如何内嵌运行?
  • .NET Standard 的管理策略
  • .net6+aspose.words导出word并转pdf
  • .NetCore项目nginx发布
  • .net程序集学习心得
  • :=
  • @Data注解的作用
  • @JSONField或@JsonProperty注解使用
  • @我的前任是个极品 微博分析
  • [《百万宝贝》观后]To be or not to be?