MySQL Foreign Key
ntroduction to MySQL foreign key
A foreign key is a field in a table that matches another field of another table. A foreign key places constraints on data in the related tables, which enables MySQL to maintain referential integrity.
Let’s take a look at the following database diagram in the sample database.

We have two tables: customers and orders. Each customer has zero or more orders and each order belongs to only one customer. The relationship between customers table and orders table is one-to-many, and it is established by a foreign key in the orders table specified by the customerNumber field. The customerNumber field in the orders table relates to the customerNumber primary key field in the customers table.
The customers table is called parent table or referenced table, and the orders table is known as child table or referencing table.
A foreign key can be a column or a set of columns. The columns in the child table often refer to the primary key columns in the parent table.
A table may have more than one foreign key, and each foreign key in the child table may refer to a different parent table.
A row in the child table must contain values that exist in the parent table e.g., each order record in the orders table must have a customerNumber that exists in the customers table. Multiple orders can refer to the same customer therefore, this relationship is called one (customer) to many (orders), or one-to-many.
Sometimes, the child and parent tables are the same. The foreign key refers back to the primary key of the table e.g., the following employees table:

The reportTo column is a foreign key that refers to the employeeNumber column which is the primary key of the employees table to reflect the reporting structure between employees i.e., each employee reports to anther employee and an employee can have zero or more direct reports. We have a specific tutorial on the self-join to help you query data against this kind of table.
The reportTo foreign key is also known as recursive or self-referencing foreign key.
Foreign keys enforce referential integrity that helps you maintain the consistency and integrity of the data automatically. For example, you cannot create an order for a non-existent customer.
In addition, you can set up a cascade on delete action for the customerNumber foreign key so that when you delete a customer in the customers table, all the orders associated with the customer are also deleted. This saves you time and efforts of using multiple DELETE statementsor a DELETE JOIN statement.
The same as deletion, you can also define a cascade on update action for the customerNumber foreign key to perform the cross-table update without using multiple UPDATE statements or an UPDATE JOIN statement.
In MySQL, the InnoDB storage engine supports foreign keys so that you must create InnoDB tables in order to use foreign key constraints.
Creating foreign keys for tables
MySQL creating foreign key syntax
The following syntax illustrates how to define a foreign key in a child table in CREATE TABLE statement.
FOREIGN KEY foreign_key_name (columns)
REFERENCES parent_table(columns)
ON DELETE action
ON UPDATE action
|
1
2
3
4
5
|
CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name (columns)
REFERENCES parent_table(columns)
ON DELETE action
ON UPDATE action
|
Let’s examine the syntax in greater detail:
- The
CONSTRAINTclause allows you to define constraint name for the foreign key constraint. If you omit it, MySQL will generate a name automatically. - The
FOREIGN KEYclause specifies the columns in the child table that refers to primary key columns in the parent table. You can put a foreign key name afterFOREIGN KEYclause or leave it to let MySQL create a name for you. Notice that MySQL automatically creates an index with theforeign_key_namename. - The
REFERENCESclause specifies the parent table and its columns to which the columns in the child table refer. The number of columns in the child table and parent table specified in theFOREIGN KEYandREFERENCESmust be the same. - The
ON DELETEclause allows you to define what happens to the records in the child table when the records in the parent table are deleted. If you omit theON DELETEclause and delete a record in the parent table that has records in the child table refer to, MySQL will reject the deletion. In addition, MySQL also provides you with actions so that you can have other options such as ON DELETE CASCADE that ask MySQL to delete records in the child table that refers to a record in the parent table when the record in the parent table is deleted. If you don’t want the related records in the child table to be deleted, you use theON DELETE SET NULLaction instead. MySQL will set the foreign key column values in the child table toNULLwhen the record in the parent table is deleted, with a condition that the foreign key column in the child table must acceptNULLvalues. Notice that if you useON DELETE NO ACTIONorON DELETE RESTRICTaction, MySQL will reject the deletion. - The
ON UPDATEclause enables you to specify what happens to the rows in the child table when rows in the parent table are updated. You can omit theON UPDATEclause to let MySQL reject any updates to the rows in the child table when the rows in the parent table are updated. TheON UPDATE CASCADEaction allows you to perform a cross-table update, and theON UPDATE SET NULLaction resets the values in the rows in the child table toNULLvalues when the rows in the parent table are updated. TheON UPDATE NO ACTIONorUPDATE RESTRICTactions reject any updates.
MySQL creating table foreign key example
The following example creates a dbdemo database and two tables: categories and products. Each category has one or more products and each product belongs to only one category. The cat_id field in the products table is defined as a foreign key with UPDATE ON CASCADE and DELETE ON RESTRICT actions.
USE dbdemo;
CREATE TABLE categories(
cat_id int not null auto_increment primary key,
cat_name varchar(255) not null,
cat_description text
) ENGINE=InnoDB;
CREATE TABLE products(
prd_id int not null auto_increment primary key,
prd_name varchar(355) not null,
prd_price decimal,
cat_id int not null,
FOREIGN KEY fk_cat(cat_id)
REFERENCES categories(cat_id)
ON UPDATE CASCADE
ON DELETE RESTRICT
)ENGINE=InnoDB;
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
CREATE DATABASE IF NOT EXISTS dbdemo;
USE dbdemo;
CREATE TABLE categories(
cat_id int not null auto_increment primary key,
cat_name varchar(255) not null,
cat_description text
) ENGINE=InnoDB;
CREATE TABLE products(
prd_id int not null auto_increment primary key,
prd_name varchar(355) not null,
prd_price decimal,
cat_id int not null,
FOREIGN KEY fk_cat(cat_id)
REFERENCES categories(cat_id)
ON UPDATE CASCADE
ON DELETE RESTRICT
)ENGINE=InnoDB;
|
Adding a foreign key to a table
MySQL adding foreign key syntax
To add a foreign key to an existing table, you use the ALTER TABLE statement with the foreign key definition syntax above:
ADD CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name(columns)
REFERENCES parent_table(columns)
ON DELETE action
ON UPDATE action;
|
1
2
3
4
5
6
|
ALTER table_name
ADD CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name(columns)
REFERENCES parent_table(columns)
ON DELETE action
ON UPDATE action;
|
MySQL adding foreign key example
Now, let’s add a new table named vendors and change the products table to include the vendor id field:
CREATE TABLE vendors(
vdr_id int not null auto_increment primary key,
vdr_name varchar(255)
)ENGINE=InnoDB;
ALTER TABLE products
ADD COLUMN vdr_id int not null AFTER cat_id;
|
1
2
3
4
5
6
7
8
9
|
USE dbdemo;
CREATE TABLE vendors(
vdr_id int not null auto_increment primary key,
vdr_name varchar(255)
)ENGINE=InnoDB;
ALTER TABLE products
ADD COLUMN vdr_id int not null AFTER cat_id;
|
To add a foreign key to the products table, you use the following statement:
ADD FOREIGN KEY fk_vendor(vdr_id)
REFERENCES vendors(vdr_id)
ON DELETE NO ACTION
ON UPDATE CASCADE;
|
1
2
3
4
5
|
ALTER TABLE products
ADD FOREIGN KEY fk_vendor(vdr_id)
REFERENCES vendors(vdr_id)
ON DELETE NO ACTION
ON UPDATE CASCADE;
|
Now, the products table has two foreign keys, one refers to the categories table and another refers to the vendors table.
Dropping MySQL foreign key
You also use the ALTER TABLE statement to drop foreign key as the following statement:
DROP FOREIGN KEY constraint_name;
|
1
2
|
ALTER TABLE table_name
DROP FOREIGN KEY constraint_name;
|
In the statement above:
- First, you specify the table name from which you want to remove the foreign key.
- Second, you put the constraint name after the
DROP FOREIGN KEYclause.
Notice that constraint_name is the name of the constraint specified when you created or added the foreign key to the table. If you omit it, MySQL generates a constraint name for you.
To obtain the generated constraint name of a table, you use the SHOW CREATE TABLE statement as follows:
|
1
|
SHOW CREATE TABLE table_name;
|
For example, to see the foreign keys of the products table, you use the following statement:
|
1
|
SHOW CREATE TABLE products;
|
The following is the output of the statement:
prd_id int(11) NOT NULL AUTO_INCREMENT,
prd_name varchar(355) NOT NULL,
prd_price decimal(10,0) DEFAULT NULL,
cat_id int(11) NOT NULL,
vdr_id int(11) NOT NULL,
PRIMARY KEY (prd_id),
KEY fk_cat (cat_id),
KEY fk_vendor(vdr_id),
CONSTRAINT products_ibfk_2
FOREIGN KEY (vdr_id)
REFERENCES vendors (vdr_id)
ON DELETE NO ACTION
ON UPDATE CASCADE,
CONSTRAINT products_ibfk_1
FOREIGN KEY (cat_id)
REFERENCES categories (cat_id)
ON UPDATE CASCADE
) ENGINE=InnoDB;
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
CREATE TABLE products (
prd_id int(11) NOT NULL AUTO_INCREMENT,
prd_name varchar(355) NOT NULL,
prd_price decimal(10,0) DEFAULT NULL,
cat_id int(11) NOT NULL,
vdr_id int(11) NOT NULL,
PRIMARY KEY (prd_id),
KEY fk_cat (cat_id),
KEY fk_vendor(vdr_id),
CONSTRAINT products_ibfk_2
FOREIGN KEY (vdr_id)
REFERENCES vendors (vdr_id)
ON DELETE NO ACTION
ON UPDATE CASCADE,
CONSTRAINT products_ibfk_1
FOREIGN KEY (cat_id)
REFERENCES categories (cat_id)
ON UPDATE CASCADE
) ENGINE=InnoDB;
|
The products table has two foreign key constraints: products_ibfk_1 and products_ibfk_2
You can drop the foreign keys of the products table by using the following statement:
DROP FOREIGN KEY products_ibfk_1;
ALTER TABLE products
DROP FOREIGN KEY products_ibfk_2;
|
1
2
3
4
5
|
ALTER TABLE products
DROP FOREIGN KEY products_ibfk_1;
ALTER TABLE products
DROP FOREIGN KEY products_ibfk_2;
|
MySQL disabling foreign key checks
Sometimes, it is very useful to disable foreign key checks e.g., when you import data from a CSV file into a table. If you don’t disable foreign key checks, you have to load data into a proper order i.e., you have to load data into parent tables first and then child tables, which can be tedious. However, if you disable the foreign key checks, you can load data in any orders.
Another example is that, unless you disable the foreign key checks, you cannot drop a table that is referenced by a foreign key constraint. When you drop a table, any constraints that you defined for the table are also removed.
To disable foreign key checks, you use the following statement:
|
1
|
SET foreign_key_checks = 0;
|
And of course, you can enable it using the statement below:
|
1
|
SET foreign_key_checks = 1;
|
In this tutorial, we have covered a lot about MySQL foreign key. We also introduced you to some very handy statements that allow you to manage foreign keys effectively in MySQL.
http://www.mysqltutorial.org/mysql-foreign-key/
MySQL Foreign Key的更多相关文章
- mysql FOREIGN KEY约束 语法
mysql FOREIGN KEY约束 语法 作用:一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY. DD马达 说明:FOREIGN KEY 约束用于预防破坏表之间连接的 ...
- MySQL—FOREIGN KEY
作用:保持数据一致性,完整性.实现一对一或一对多关系.(学习的过程中,老师说,实际的生产中,一般不使用物理上的外键约束的,都是使用逻辑上的外键约束) 要求: 父表与子表的存储引擎必须相等,而且只能是I ...
- mysql foreign key(外键) 说明与实例
一,什么是foreign key,及其完整性 个人觉得,foreign key就是表与表之间的某种约定的关系,由于这种关系的存在,我们能够让表与表之间的数据,更加的完整,关连性更强.关于完整性,关连性 ...
- mysql foreign key 外键
ALTER TABLE `fd_rel_customer_doctor` ADD CONSTRAINT `FK_fd_rel_customer_doctor_1` FOREIGN KEY (`CUST ...
- 更改具有Foreign key约束的表
1.Foreign key 说明: foreign key(外键) 建立起了表与表之间的约束关系,让表与表之间的数据更具有完整性和关联性.设想,有两张表A.B,A表中保存了许多电脑制造商的信息,比如联 ...
- MySQL主从复制中断,报“Error on master: message (format)='Cannot delete or update a parent row: a foreign key constraint fails' error code=1217” 错误
前几天,发现从库挂了,具体报错信息如下: 分析思路 1. 因为我采用的是选择性复制,只针对以下几个库进行复制: card,upay,deal,monitor,collect.所以,不太可能出现对于sa ...
- MYSQL外键(Foreign Key)的使用
在MySQL 3.23.44版本后,InnoDB引擎类型的表支持了外键约束.外键的使用条件:1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持): ...
- mysql 外键(FOREIGN KEY)
最近有开始做一个实验室管理系统,因为分了几个表进行存储·所以要维护表间的关联··研究了一下MySQL的外键. (1)只有InnoDB类型的表才可以使用外键,mysql默认是MyISAM,这种类型不支持 ...
- MySQL添加外键时报错 ERROR 1215 (HY000): Cannot add foreign key constraint
1.数据类型 2.数据表的引擎 数据表 mysql> show tables; +------------------+ | Tables_in_market | +--------- ...
随机推荐
- Stamps ans Envelope Sive UVA - 242
( ||{集合x}表示x中元素1||x中元素2||...||x的最后一个元素||(a,b)表示a||b) ans[i][j][k]表示考虑前i种邮票时取j个邮票能否得到面值kans[i][j][k]= ...
- python优缺点分析及python种类
Python的缺点: 相较于其它类型的语言可能运行速度上会略差.C语言的运行性能速度上最好,因为C最接近计算机底层. Python的优点: 大数据处理,有专门的功能模块,比较方便. Linux自带Py ...
- break跳出嵌套循环体
package com.wh.Object; public class Test { public static void main(String[] args) { // TODO Auto-gen ...
- js的replace函数把"$"替换成成"\$"
var aa = 18$ 转换成 aa = 18\$ aa.replace("\$","\\\$"); 注意JS的replace方法只能替换第一 ...
- 工具类学习-java实现邮件发送激活码
问题:用java实现服务器发送激活码到用户邮件. 步骤一:如果是个人的话,确保在本地安装邮件服务器(易邮服务器)和邮件客户端(foxmail). 步骤二:导入jar包 mail.jar,其他的需要什 ...
- 升级 Cocoapods 到1.2.0指定版本,降低版本及卸载
=====================升级版本=================== CocoaPods 1.1.0+ is required to build SnapKit 3.0.0+. 在 ...
- 微信轻松接入QQ客服
一直以来,大家都苦恼怎么实现微信公众帐号可以接入客服,也因此很多第三方接口平台也开发客服系统CRM系统,不过不是操作复杂就是成本太高.今天分享一个低成本又简便的方法,让你的公众帐号接入QQ客服.下面介 ...
- Farseer.net轻量级ORM开源框架说明及链接索引
项目简介 基于.net framework 4 开发. 基于Lambda表达式快速上手的ORM框架. 参考Entity Framework的调用方式. 基于Database First模式. POCO ...
- Youtube-dl 简短使用总结
默认下载bestvideo+bestaudio,并通过ffmpeg -c copy output.mp4 简单的封装进mp4格式,而不进行转码. 有时候bestaudio 是opus编码的,但是mp4 ...
- Ubuntu 下更新或下载输入法(搜狗)
ubuntu12.04的fcitx版本不支持,不满足依赖,需要更新fcitx 添加fcitx源添加fcitx源命令 : sudo add-apt-repository ppa:fcitx-team/n ...