当前位置: 首页 > 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)
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • Computed property XXX was assigned to but it has no setter
  • hadoop集群管理系统搭建规划说明
  • isset在php5.6-和php7.0+的一些差异
  • java8-模拟hadoop
  • JavaScript 基础知识 - 入门篇(一)
  • Lucene解析 - 基本概念
  • Magento 1.x 中文订单打印乱码
  • nginx 配置多 域名 + 多 https
  • Terraform入门 - 1. 安装Terraform
  • 从PHP迁移至Golang - 基础篇
  • 机器学习 vs. 深度学习
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 追踪解析 FutureTask 源码
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • $.ajax()
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (vue)页面文件上传获取:action地址
  • (备忘)Java Map 遍历
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (强烈推荐)移动端音视频从零到上手(上)
  • (四)汇编语言——简单程序
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .NET delegate 委托 、 Event 事件
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .NetCore部署微服务(二)
  • /etc/fstab 只读无法修改的解决办法
  • []T 还是 []*T, 这是一个问题
  • [51nod1610]路径计数
  • [Android] 240204批量生成联系人,短信,通话记录的APK
  • [Bada开发]初步入口函数介绍
  • [BIZ] - 1.金融交易系统特点
  • [C# 网络编程系列]专题六:UDP编程