[mysql基础文档]-17-Foreign Key约束

引言

前面介绍的所有约束都只针对同一个表的某列,本文介绍的Foreign Key约束可以在两个或多个表中建立约束,也叫外键约束。

文章目录

0×1.建表时如何创建Foreign Key约束

外键约束就是将A表的某列和B表某列做一个连接,只有当B表的那一列存在某值时,A表对应的那一列才能出现某值。

建表时可以使用下面的语法来创建外键:

					--创建表t25,仅设置一列主键列
					mysql> create table t25(id int primary key);

					--外键创建语法是写在所有列声明的后面,用逗号分隔,这种方法并没有给外键自定义名称
					--foreign key(本表列) references [外表名](外表参考列)
					mysql> create table t26(id int primary key,foreign key(id) references t25(id));

					--此时t25表为空,尝试向t26表的id列插入数值1,报错,因为t25表的id列并没有数值1
					mysql> insert into t26 values(1);
					ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails 
					...KEY (`id`) REFERENCES `t25` (`id`))

					--只有先给t25的id列插入了数值1
					mysql> insert into t25 values(1);

					--才能向t26的id列插入此数值,这就是外键的作用
					mysql> insert into t26 values(1);
					

创建自定义名称的外键:

					--给外键约束自定义名称是一个好习惯,为未来数据表维护带来方便,CustomName是我们自定义的名称
					mysql> create table t26(id int primary key,constraint CustomName foreign key(id) references t25(id));
					

0×2.建表后如何追加Foreign Key约束

使用下面的语句可以向一个不存在Foreign Key约束的列追加此属性:

					--建表时t27的id列并没有外键约束
					mysql> create table t27(id int primary key);

					--给t27表的id列添加外键约束,连接到t25表的id列
					mysql> alter table t27 add foreign key(id) references t25(id);

					--添加自定义名称外键语法,效果同上,但多了个名称CustomName
					mysql> alter table t27 add constraint CustomName foreign key (id) references t25 (id);
					

P.s:给已经存在的列追加Foreign Key时应该特别注意,这个已存在的列的列数据,必须在要连接到的表对应的参考列中已经存在,否则会报错添加外键约束失败,这一点同本文第一部分向外键列插入一个参考列不存在的值时报错是一个道理。

0×3.如何删除Foreign Key约束

对于没有自定义名称的Foreign Key约束,删除稍微有点麻烦,此时,自定义名称的优势就显现出来了:

					--(MySQL数据库)删除上面未命名的外键约束,需要先查看建表过程,会看到MySQL随机自定义的一个Foreign Key约束名`t27_ibfk_1`
					mysql> show create table t27\G
					****************** 1. row ******************
					       Table: t27
					Create Table: CREATE TABLE `t27` (
					  `id` int(11) NOT NULL,
					  PRIMARY KEY (`id`),
					  CONSTRAINT `t27_ibfk_1` FOREIGN KEY (`id`) REFERENCES `t25` (`id`)
					) ENGINE=InnoDB DEFAULT CHARSET=latin1

					--使用上面查看到的名称来删除外键约束(MySQL语法)
					mysql> alter table t27 drop foreign key t27_ibfk_1;

					--其他数据库删除外键约束的方法
					db001> alter table t27 drop constraint t27_ibfk_1;

					--如果是我们自定义的外键约束名称叫CustomName,删除方法相同
					mysql> alter table t27 drop foreign key CustomName;