史上最简单的 MySQL 教程(二十八)「外键(上)」

温馨提示:本系列博文已经同步到 GitHub,地址为「mysql-tutorial」,欢迎感兴趣的童鞋StarFork,纠错。

外键

外键foreign key,外面的键,即不在自己表中的键。如果一张表中有一个非主键的字段指向另外一张表的主键,那么将该字段称之为外键。每张表中,可以有多个外键。

新增外键

外键既可以在创建表的时候增加,也可以在创建表之后增加(但是要考虑数据的问题)。

第 1 种:在创建表的时候,增加外键

  • 基本语法foreign key(外键字段) + references + 外部表名(主键字段);

执行如下 SQL 语句,进行测试:

-- 创建外键
create table my_foreign1(
	id int primary key auto_increment,
	name varchar(20) not null comment '学生姓名',
	c_id int comment '班级表ID',
	-- 增加外键
	foreign key(c_id) references class(id)	
)charset utf8;
foreign1

观察上图可知,字段c_idkey显示为MUL,表示多个键的意思。这是因为外键要求字段本身是一个索引(普通索引)如果字段本身没有索引,外键就会先创建一个索引,然后才创建外键本身。此外,CONSTRAINT后面的my_foreign_ibfk_1表示外键的名字。

第 2 种:在创建表之后,增加外键

  • 基本语法alter table + 表名 + add[constraint + 外键名字] + foreign key(外键字段) + references + 外部表名(主键字段);

执行如下 SQL 语句,进行测试:

-- 创建外键
create table my_foreign2(
	id int primary key auto_increment,
	name varchar(20) not null comment '学生姓名',
	c_id int comment '班级表ID'
)charset utf8;

-- 增加外键
alter table my_foreign2 add
-- 指定外键名
constraint test_foreign
-- 指定外键字段
foreign key(c_id)
-- 引用外部表主键
references class(id);
foreign2

如上图所示,显然咱们已经增加外键成功啦!

修改外键 & 删除外键

外键不能修改,只能先删除后增加。

  • 基本语法alter table + 表名 + drop foreign key + 外键名字;

执行如下 SQL 语句,进行测试:

-- 删除外键
alter table my_foreign1 drop foreign key my_foreign1_ibfk_1;
foreign3

观察上图可知,删除外键不能通过查看表结构来体现,而是应该通过创建表的语句来查看。


温馨提示:符号[]括起来的内容,表示可选项;符号+,则表示连接的意思。


———— ☆☆☆ —— 返回 -> 史上最简单的 MySQL 教程 <- 目录 —— ☆☆☆ ————

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Aloys的开发之路

Android Studio移动鼠标显示悬浮提示的设置方法

以Windows 10 + Android Studio 3.0.1为例 默认情况下,在Android Studio中将鼠标移动到函数位置处无法显示悬浮提示,需...

1775
来自专栏企鹅号快讯

MySQL的常用操作命令整理

缘由:初次接触命令行操作MySQL数据库,使用还不熟练,故整理之,方便日后查阅。 备注: 用户登录MySQL后,对数据库操作的命令基本都以”;” 或 “g”结尾...

1856
来自专栏玄魂工作室

免杀后门之MSF&Veil-Evasion的完美结合

Veil-Evasion 是 Veil-Framework 框架的一部分,也是其主要的项目。利用它我们可以生成绕过杀软的 payload !kali 上并未安装...

2824
来自专栏林德熙的博客

Roslyn 使用 Directory.Build.props 文件定义编译

本文告诉大家 Directory.Build.props 是什么有什么优点?如何使用 Directory.Build.props 文件定义编译

432
来自专栏抠抠空间

MySQL之pymysql模块

PyMySQL介绍 PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb。 Django中...

2847
来自专栏古时的风筝

Linux下安装Apache并以mod_wsgi方式部署django站点

源码编译方式安装Apache 首先下载Apache源码压缩包,地址为http://mirror.bit.edu.cn/apache/httpd/ 继续下载apr...

3009
来自专栏性能与架构

Mysql 高可用 InnoDB Cluster 多节点搭建过程

1. 简介 InnoDB Cluster 的搭建可以分为两种情况: (1)实验环境 使用 sandbox 沙箱模拟数据库实例,这个非常简单,可以参考之前的一篇文...

3586
来自专栏开源优测

AutoLine源码分析之入口源码

AutoLine开源平台是一个开源自动化测试解决方案,基于RobotFramework进行二次开发,支持RobotFramework几乎所有的库。

983
来自专栏魏艾斯博客www.vpsss.net

SFTP 和 FTP 的区别及用 SFTP 代替 FTP

2703
来自专栏hbbliyong

WPF备忘录(7)WPF图片资源路径介绍

在项目中增加两张图片Content.jpg和Resource.jpg,分别将其生成操作属性设置为Content和Resource。      在界面中增加两个I...

2695

扫码关注云+社区