|
使用外键的意义是:由于在实际工作中,我们在描述一个事物时需要建立多个字段,例如:我们要描述一件商品,可能需要几十个字段。然而将多个字段全部放入一张表中这会大大降低数据查询效率,所以我们常常会将一张表拆分成多张表来存放数据,比如:我们会将一些经常查询的字段放在一张表中,或者将所有字段进行分组后用多表存放等等,然后借助外键将这些表关联起来。
下面,我们就用最直白的方式来让大家彻底理解外键的操作方法:首先我们创建两张表
- create table stu888(`id`tinyint primary key,`name` varchar(10))engine=innodb;
- create table stu999(`id` tinyint primary key,`sid` tinyint,`age` tinyint)engine=innodb;
复制代码
语句解释:- engine=innodb --使用外键必须使用innodb引擎。
- stu888是主表,stu999是从表,主表的外键字段必须和从表关联字段的数据类型完全一致。
- 我们下面要实现的是:主表的id字段和从表的sid字段建立外键。
- 主表和从表都有id字段,全部设为主键。
- 从表中增加sid字段,数据类型和主表的id字段一致。
- 将从表的sid字段和主表的id字段关联为外键,删除置空,更新级联。
复制代码
操作如下:
- alter table stu999 add foreign key(sid) references stu888(id) on delete set null on update cascade;
复制代码 语句解释:
- alter table stu999 add foreign key(sid) --给stu999表的sid字段添加外键,foreign key为外键关键词。
- references stu888(id) --关联stu888表的id字段,references为关键词。
- on --设置外键属性。
- delete set null --删除置空。
- update cascade --更新级联。
复制代码 操作结果如下:
- constraint --限定条件
- stu999_ibfk_1 --外键的名称
复制代码
下面我们分别给主表和从表插入数据:
- insert into stu888 values(1,'张三'),(2,'李四');
- insert into stu999 values(1,1,33),(2,2,44);
复制代码
下面我们修改主表stu888中name为李四的数据id为3,按照更新级联的原理,修改stu888表后stu999的sid字段也会自动更新为3,我们测试一下是否是这样呢
- update stu888 set id=3 where name='李四';
复制代码
实验结果完全符合我们的预期。
下面我们删除主表stu888中id为1的数据行,看一下从表stu999会发生什么变化。按照删除置空的原理,本操作后stu999表中sid为1的数据会置空,我们测试一下是否是这样呢
- delete from stu888 where id=1;
复制代码
实验结果完全符合我们的预期。
ok,以上就是外键的全部使用方法。
下面我们使用sql语句将已添加的外键删除
- alter table stu999 drop foreign key `stu999_ibfk_1`;
复制代码 执行结果如下:
外键已经消失了。
好了,下面大家自己测试一下,一定要多多练习。
|
|