MySql中的外键foreign key

一、首先创建三张表,并插入相应的数据:

create table student(
sid int(10) primary key not null,
name char(120),
sex char(120),
dept char(120)
);
 
插入数据
insert into student
values
(1,"mmm","nan","jisuanji dept");
insert into student
values
(2,"nnnn","nv","jiusanji dept");
insert into student
values
(3,"sss","nan","jisuanji dept");
 
创建一张课程表
create table course(
cid int(10) primary key not null,
cname char(120),
ccredit int(10)
);
 
插入数据:
insert into course
values
(11,"jisuanji",10);
insert into course
values
(12,"C_yuyan",8);
insert into course
values
(13,"C++",9);
 
创建学生选课表
create table stucourse(
scid int(10) primary key not null,
sid int(10),
cid int(10),
[constraint sid_fk] foreign key(sid) references student(sid),
[constraint cid_fk] foreign key(cid) references course(cid),
grade int(10)
);
 
插入数据
insert into stucourse
values
(1,1,11,90);
insert into stucourse
values
(2,1,12,88);
insert into stucoruse
values
(3,2,13,86);
insert into stucourse
values
(4,3,11,78);

<!--或者在创建完三张表之后再加外键-->
alter table stucourse
add [constraint sid_fk]  foreign key (sid) references student (sid);
alter table stucourse
add [constraint cid_fk]  foreign key (cid) references student (cid);
<!--删除外键-->
alter table stucourse drop foreign key 外键名字;

 在第三张表stucourse里面,设置了 stucourse 的外键链接,分别引用了 student  的 sid 外键 和 course 的 cid 外键。

  在设置外键的默认情况下,你插入表stucourse 一条数据必需要求其外键字段值在表student  和表course 的相对应的外键链接字段能找到,否则插入失败。并且当 stucourse 表里面没有插入相关数据的时候,删除或修改student 表或者是 course 表里面的一条记录或者字段,是可以的,但是一旦 stucourse 表里面添加了相关数据,即:从表创建外键的字段引用了主表的外键链接字段值,那么就不能删除或修改 student 表 和 course 表里面对应的一条记录了。这就是所谓的保持数据的一致性和完整性

1、外键的默认作用有两点:

  ① 对从(子)表(外键所在的表)的作用:从表在进行写操作的时候,如果外键字段在主表中找不到对应的匹配,操作就会失败。

  ② 对主(父)表的作用:对主表的外键链接字段进行删和改时,如果对应的该字段在从表中被引用,操作就会失败。

1、使用外键的使用规则:

  ① 表储存引擎必须是innodb,否则创建的外键无约束效果。

  ② 外键的列类型必须与父表的主键类型完全一致。

  ③ 外键的名字不能重复,即:外键必须是主表的唯一键。注意:从表引用外键的字段不一定须为其主键,主表的外键也不一定须为其主键。

  ④ 子表已经存在数据的字段被设为外键时,必须保证字段中的数据与主表的外键数据对应起来。

2、外键的定制作用(三种约束模式):

  ① district:严格模式(默认), 父表不能删除或更新一个被子表引用的记录。

  ② cascade:级联模式, 父表操作后,子表关联的数据也跟着一起操作。

  ③ set null:置空模式,前提外键字段允许为NLL,  父表操作后,子表对应的字段被置空。

3、使用外键的优缺点

优点:① 由数据库自身保证数据一致性,完整性,更可靠,因为程序很难100%保证数据的完整性,而用外键即使在数据库服务器当机或者出现其他问题的时候,也能够最大限度的保证数据的一致性和完整性。

    ② 有主外键的数据库设计可以增加ER图的可读性,这点在数据库设计时非常重要。

    ③ 外键在一定程度上说明的业务逻辑,会使设计周到具体全面。

缺点:影响数据库在insert,update,delete数据的时的性能。

   eg:在海量的数据库中想都不要去想外键,试想,一个程序每天要insert数百万条记录,当存在外键约束的时候,每次要去扫描此记录是否合格,一般还不 止一个字段有外键,这样扫描的数量是成级数的增长!我的一个程序入库在3个小时做完,如果加上外键,需要28个小时! 

结论:① 在大型系统中(性能要求不高,安全要求高),使用外键;在大型系统中(性能要求高,安全自己控制),不用外键;小系统随便,最好用外键。

    ② 用外键要适当,不能过分追求(可以用触发器或应用程序保证数据的完整性)。

 

参考文章:

https://www.cnblogs.com/wasayezi/p/7412049.html

https://www.cnblogs.com/pengyin/p/6375860.html

https://www.cnblogs.com/brucemengbm/p/6897410.html 

转载于:https://www.cnblogs.com/java-jun-world2099/articles/9699071.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值