博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySql中的外键foreign key
阅读量:6912 次
发布时间:2019-06-27

本文共 2629 字,大约阅读时间需要 8 分钟。

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

create table student(sid int(10) primary key not null,name char(120),sex char(120),dept char(120)); 插入数据insert into studentvalues(1,"mmm","nan","jisuanji dept");insert into studentvalues(2,"nnnn","nv","jiusanji dept");insert into studentvalues(3,"sss","nan","jisuanji dept"); 创建一张课程表create table course(cid int(10) primary key not null,cname char(120),ccredit int(10)); 插入数据:insert into coursevalues(11,"jisuanji",10);insert into coursevalues(12,"C_yuyan",8);insert into coursevalues(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 stucoursevalues(1,1,11,90);insert into stucoursevalues(2,1,12,88);insert into stucorusevalues(3,2,13,86);insert into stucoursevalues(4,3,11,78);
alter table stucourseadd [constraint sid_fk] foreign key (sid) references student (sid);alter table stucourseadd [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

你可能感兴趣的文章
Activiti解析.bpmn文件获得User Task节点的CandidateUsers特性的值
查看>>
树莓派进阶之路 (016) - 通过595驱动4位LED显示系统时间
查看>>
Python网络爬虫(一):初步认识网络爬虫
查看>>
assets raw 资源 AssetManager
查看>>
[基础规范]JavaBeans规范
查看>>
VMware80端口映射
查看>>
同一个tomcat多个项目共享session,一个tomcat两个项目共享sessionId
查看>>
centos安装man中文手册
查看>>
网络通信与面相对象
查看>>
获取图片的真实宽高
查看>>
基于VHDL利用PS2键盘控制的电子密码锁设计
查看>>
深入分析JavaWeb Item22 -- 国际化(i18n)
查看>>
SQL Server -- 随笔
查看>>
Java Annotation 应用 -- 导出Excel表格
查看>>
git使用教程1-本地代码上传到github
查看>>
wkhtmlpdf安装以及中文乱码
查看>>
oc43--野指针和空指针
查看>>
装饰器1、无参数的装饰器 2、有参数的装饰器 3、装饰器本身带参数的以及如果函数带return结果的情况...
查看>>
Selenium:三种等待方式
查看>>
关于脏读、不可重复读和幻读
查看>>