MySQL外键级联的实现
简介
mysql外键起到约束作用,在数据库层面保证数据的完整性。
例如使用外键的CASCADE(cascade串联)类型,当子表(例如user_info)关联父表(例如user)时,父表更新或删除时,子表会更新或删除记录,这个过程是数据库层面完成的。
早期企业系统数据库设计里面比较多,虽说帮程序员节省了delete、update操作,实际上增加了潜规则,也增加了软件复杂度,也会减弱性能。
所以在应用程序设计中,我们应尽量在应用层保证数据的完整性(如使用事务处理机制),而不是数据库层面。
下面对MySQL的外键进行介绍。
MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引。
在创建索引的时候,可以指定在删除、更新父表时,对子表进行的相应操作,包括
- RESTRICT (restrict 约束 限制)
- NO ACTION
- SET NULL
- CASCADE (串联)
RESTRICT和NO ACTION相同,是指在子表有关联记录的情况下父表不能更新;
CASCADE表示父表在更新或者删除时,更新或者删除子表对应记录;
SET NULL则是表示父表在更新或者删除的时候,子表的对应字段被SET NULL。
示例
因为只有InnoDB引擎才允许使用外键,所以,我们的数据表必须使用InnoDB引擎。
创建数据库:
Create database test;
一、首先创建两张表stu,sc
create table stu(
sid int UNSIGNED primary key auto_increment,
name varchar(20) not null)
TYPE=InnoDB charset=utf8;
create table sc(
scid int UNSIGNED primary key auto_increment,
sid int UNSIGNED not null,
score varchar(20) default '0',
index (sid), --外键必须加索引
FOREIGN KEY (sid) REFERENCES stu(sid) ON DELETE CASCADE ON UPDATE CASCADE)
TYPE=InnoDB charset=utf8;
–说明: 外键必须建立索引;
FOREIGN key(sid) 设置外键,把sid设为外键
REFERENCES stu(sid) 引用作用。引用stu表中的sid
ON DELETE CASCADE 级联删除
ON UPDATE CASCADE 级联更新
二、向两张表插入数据
insert into stu (name) value ('zxf');
insert into stu (name) value ('ls');
insert into stu (name) value ('zs');
insert into stu (name) value ('ww');
insert into sc(sid,score) values ('1','98');
insert into sc(sid,score) values ('1','98');
insert into sc(sid,score) values ('2','34');
insert into sc(sid,score) values ('2','98');
insert into sc(sid,score) values ('2','98');
insert into sc(sid,score) values ('3','56');
insert into sc(sid,score) values ('4','78');
insert into sc(sid,score) values ('4','98');
注意:在sc表中插入数据时,若插入的sid为22,则会插入失败,违反外键约束,因为外键sid
来自stu表中的id的主键,即stu中的id没有等于22的数据。
级联删除:将stu表中id为2的学生删除,该学生在sc表中的成绩也会级联删除
delete from stu where sid = '2';
级联更新:stu表中id为3的学生更改为id为6,该学生在sc表中的对应id也会级联更新
update stu set sid=6 where sid='3';
注意
删除表的时候必须先删除外键表(sc),再删除主键表(stu)
上图为违反外键约束,不能删除
上图为正常删除,先删除sc表,再删除stu表!
到此这篇关于MySQL外键级联的实现的文章就介绍到这了,更多相关MySQL外键级联内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341