史上最简单的 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 条评论
登录 后参与评论

相关文章

来自专栏跟着阿笨一起玩NET

我的MYSQL学习心得(一) 简单语法

使用MYSQL有一段时间了,由于公司使用SQLSERVER和MYSQL,而且服务器数量和数据库数量都比较多

1771
来自专栏C/C++基础

MySQL如何将select子查询结果横向拼接后插入数据表中

除了最后一列默认是当前时间戳,每一列的结果都是一个select查询结果。如何将查询的结果合并成一条记录插入到上面的数据表中呢?网上也没有确切的答案,摸索了很久,...

1422
来自专栏资深Tester

SQL系列之DDL/DCL语言

2406
来自专栏杨建荣的学习笔记

两个死锁的实例 (r5笔记第90天)

关于数据库中的死锁。如果在应用中碰到都会毫不犹豫转交给DBA,但是从目前我接到的deadlock的问题来看,和Oracle官方的描述基本都是一致的。 The f...

3126
来自专栏北京马哥教育

给linux用户的11个高级MySQL数据库面试问题和答案

1. 如何使用SELECT语句找到你正在运行的服务器的版本并打印出当前数据库的名称? 答:下面的语句的结果会显示服务器的版本和当前的数据库名称 mysql>...

2674
来自专栏吴伟祥

MySQL 存储引擎 原

使用MEMORY存储引擎的表,其数据存储在内存中,且行的长度固定,这两个特点使得MEMORY存储引擎非常快。

691
来自专栏java一日一条

[MySQL] 关于MySQL一些重要的特征

521
来自专栏Java成神之路

Oracle学习笔记_01_SQL初步

   DML: Data Manipulation Language        数据操纵语言 DDL: Data Definition Languag...

773
来自专栏MySQL内核

MySQL InnoDB创建索引

InnoDB的索引基于B+树实现,每张InnoDB的表都有一个特殊的索引,叫做聚簇索引(Clustered Index),聚簇索引存储了表中的真实数据。索引项的...

3162
来自专栏别先生

MySql的基本操作以及以后开发经常使用的常用指令

第一章:数据类型和操作数据表 MySQL语句的规范 (1):关键字与函数名称全部大写 (2):数据库名称,表名称,字段名称全部小写 (3):SQL语句必须以分号...

18610

扫码关注云+社区