MySQL外键(详解)
Posted 网易测试开发猿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL外键(详解)相关的知识,希望对你有一定的参考价值。
mysql外键(详解)
什么是外键:
外键是指引用另外一个表中的一列或多列数据,被引用的列应该具有主键约束或者唯一性约束(简单来说外键是另一个表的主键或者唯一约束)。外键可以有重复的, 可以是空值,用来建立和加强两个表数据之间的连接
一、主外键关系
在上图上涉及的两个表中,学生信息表 (stuInfo)为主表,学生
成绩表(score)为从表;那么主从表之间有什么关系呢?
1、当主表中没有对应的记录时,不能将记录添加到子表
--------学生成绩表中不能出现学生信息表中没有的学号
2、不能更改主表中的值而导致子表中的记录孤立
--------学生信息表中的id变化了,学生成绩表中的id也要随着发生改变
3、子表存在与主表对应的记录,不能从主表中删除该行
--------不能把部门表中的数据删除
4、删除主表前,先删子表
--------先删除成绩表、后删除学生信息表
二、外键的使用
外键的使用需要满足下列的条件:
1、两张表必须都是InnoDB表,并且它们没有临时表。
2、建立外键关系的对应列必须具有相似的InnoDB内部数据类型。
3、建立外键关系的对应列必须建立了索引。
创建外键的两种方式:
方式一:在创建表的时候进行添加
方式二:表已经创建好了,继续修改表的结构来添加外键。
在创建表的时候添加外键:
表1:
create table stuInfo(
Scode int primary key, --学生的学号
Sname char(10), --学生的姓名
Saddress varchar(50), --学生的住址
Sgrade int, --学生所在班级
Semail varchar(50), --学生的邮箱地址
Sbrith date
)DEFAULT CHARSET='utf8';
表2:
create table score(
studentID int,
coureseID int,
score int,
scoreID int primary key,
foreign key(studentID) references stuInfo(Scode) --添加外键 )
DEFAULT charset='utf8';
建表以后添加外键:
语法:alter table 表名称 add foreign key (列名称) references
关联表名称(列名称);
例:
alter table stuInfo add foreign key (scode) references score(studentID);
三、删除外键
语法:alter table 表名称 drop foreign key 外键名称;
例:
alter table score drop foreign key score_ibQk_1;
注意:如果没有在建表的时候标明外键名称,
可以通过:
show create table 表名;
进行查看外键名称
mysql--外键(froeign key)-----------MySQL外键使用详解
如果一个实体的某个字段指向另一个实体的主键,就称为外键
被指向的实体,称之为主实体(主表),也叫父实体(父表)。
负责指向的实体,称之为从实体(从表),也叫子实体(子表)
作用:
用于约束处于关系内的实体
增加子表记录时,是否有与之对应的父表记录
如果主表没有相关的记录,从表不能插入
先插入主表数据后再插入从表数据:
在删除或者更新主表记录时,从表应该如何处理相关的记录
设置级联操作:
在主表数据发生改变时,与之关联的从表数据应该如何处理
使用关键字:
on update
on delete
来标识
允许的级联动作:
cascade关联操作,如果主表被更新或删除,从表也会执行相应的操作
set null,表示从表数据不指向主表任何记录
restrict:拒绝主表的相关操作
alter table t_student add foreign key (class_id) references t_class (class_id)
on delete set null; # 在删除外键时,将从表的外键值设置为null
修改外键:
先删除这个表的外键,然后再增加
alter table tb_name drop froeign key 外键名称
外键名称在建立外键时可以自定义名称,如果不自定义,会按照mysql自动生成一个名称
show create table tb_name;
alter table t_student drop foreign key t_student_ibfk_1;
删除外键后不会对表中的数据造成任何影响,改变的只是对表的一种约束
alter table t_student add foreign key (class_id) references t_class (class_id)
on delete set null; # 在删除外键时,将从表的外键值设置为null
注:on delete 与on update 可以同时出现,
但在on delete 或on update 后不能同时出现cascade、set null、restrict,只能有一个
关于restrict的外键约束此处没有写,与其他两个一样
restrict:拒绝主表的相关操作,在主表更新或者删除数据时,在从表中存在与主表主键相关的数据,则不允许对主表数据进行更新或者删除
在不设置任何级联关系约束时,主表默认会是restrict
在restrict约束下,如果想要删除主表数据,除了可以删除没有与子表数据相关的数据外,
可以先修改子表中的外键(修改时,外键必须也要关联到主表的主键,否则不能修改成功)
也可以先删除与想要删除的主表数据的子表数据,再去删除此条主表数据
原网址:http://www.cnblogs.com/zunpeng/p/3878459.html
最近有开始做一个实验室管理系统,因为分了几个表进行存储·所以要维护表间的关联··研究了一下MySQL的外键。
(1)只有InnoDB类型的表才可以使用外键,mysql默认是MyISAM,这种类型不支持外键约束
(2)外键的好处:可以使得两张表关联,保证数据的一致性和实现一些级联操作;
(3)外键的作用:
保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。 使两张表形成关联,外键只能引用外表中的列的值!
(4)建立外键的前提:
两个表必须是InnoDB表类型。
使用在外键关系的域必须为索引型(Index)。
使用在外键关系的域必须与数据类型相似
(5)创建的步骤
指定主键关键字: foreign key(列名)
引用外键关键字: references <外键表名>(外键列名)
(6)事件触发限制:on delete和on update , 可设参数cascade(跟随外键改动), restrict(限制外表中的外键改动),set Null(设空值),set Default(设默认值),[默认]no action
(7)举例
outTable表 主键 id 类型 int
创建含有外键的表:
create table temp(
id int,
name char(20),
foreign key(id) references outTable(id) on delete cascade on update cascade);
说明:把id列 设为外键 参照外表outTable的id列 当外键的值删除 本表中对应的列筛除 当外键的值改变 本表中对应的列值改变。
create table temp( id int, name char(20), foreign key(id) references outTable(id) on delete cascade on update cascade);
缺点:在对MySQL做优化的时候类似查询缓存,索引缓存之类的优化对InnoDB类型的表是不起作用的,还有在数据库整体架构中用得同步复制也是对InnoDB类型的表不生效的,像数据库中核心的表类似商品表请大家尽量不要是使用外键,如果同步肯定要同步商品库的,加上了外键也就没法通不了,优化也对它没作用,岂不得不偿失,做外键的目的在于保证数据完整性,请大家通过程序来实现这个目的而不是外键,切记!
原网址:http://www.jb51.net/article/62971.htm
以上是关于MySQL外键(详解)的主要内容,如果未能解决你的问题,请参考以下文章