12.外键约束

 

外键约束

Foreign  Key

外键约束

保持数据一致性、完整性,

实现一对一,一对多关系

foreign  key(当前表中的列,如:id) reference 关联的表的表名(关联的表中的列)

实际项目中,上面这种物理外键并不常用,一般通过逻辑外键进行定义,即通过表结构进行外键约束,即创建表的时候不要去写它在句子里,我只要知道memberid就是指代member中的id就够了,就是我们自己去约束,通过数据字典指代用户表中的id就可以了。。

外键的条件:

1.子表和父表必须存储引擎相同

2.数据表存储引擎为InnoD8

3.外键列和参照列数据类型要一直(数字长度和是否有符号要保持一致,字符长度可以不同)

4.外键列和参照列必须创建索引。

 什么是引擎?

引擎(Engine):是电子平台上开发程序或系统的核心组件。利用引擎,开发者可迅速建立、铺设程序所需的功能,或利用其辅助程序的运转。一般而言,引擎是一个程序或一套系统的支持部分。常见的程序引擎有游戏引擎,搜索引擎,杀毒引擎等。

存储引擎就是指表的类型以及表在计算机上的存储方式

存储引擎的概念是MySQL的特点,Oracle中没有专门的存储引擎的概念,Oracle有OLTP和OLAP模式的区分。不同的存储引擎决定了MySQL数据库中的表可以用不同的方式来存储。我们可以根据数据的特点来选择不同的存储引擎。

1.InnoDB

InnoDB给MySQL的表提供了事务处理回滚崩溃修复能力多版本并发控制的事务安全。在MySQL从3.23.34a开始包含InnnoDB。它是MySQL上第一个提供外键约束的表引擎。而且InnoDB对事务处理的能力,也是其他存储引擎不能比拟的。靠后版本的MySQL的默认存储引擎就是InnoDB支持id自增,还支持外键

innoDB的优势在于提供了良好的事务处理、崩溃修复能力和并发控制。缺点是读写效率较差,占用的数据空间相对较大(连表查询)。

2.MyISAM

MyISAM的表存储成3个文件。文件的名字与表名相同。拓展名为frmMYDMYI。其实,frm文件存储表的结构;MYD文件存储数据,是MYData的缩写;MYI文件存储索引,是MYIndex的缩写。

基于MyISAM存储引擎的表支持3种不同的存储格式。包括静态型、动态型和压缩型。

其中,静态型是MyISAM的默认存储格式,它的字段是固定长度的,该表具有极高的访问速度,即使在操作相当的数据表也是如此,但其最大的缺点就是占用空间较大;

 

注意:那么,怎么去看它是不是InnoD8的存储引擎呢,可以把整个库,转存为一条SQL到桌面去保存,如下图:

转存完后,然后来查看这条SQL语句,拖动text到Sublime Text中(一种编译器,类似pycharm的工具),如下图:

 

上图中ENGINE=MYISAM,这个就表示它不是InnoD8的引擎,它的要求是外键必须使用InnoD8的引擎。

解决办法:

在查询界面输入show ENGINES 

可以看出上图默认的是MyISAM,而我们要的是Inno8这种存储引擎,因此在创建表的时候,在与外键关联的表创建的语句最后面写入ENGINE=InnoD8

创建完成运行后,打开表,选外键可以看到是表中的哪列,参考了哪个数据库中哪个表中的哪个栏位。如下图:

 

 现在演练一遍:

1,先在member表中添加一条记录,如下图:

接下来这个会员肯定要在loan表中寸一条记录:

如上图,会提示两表的外键关联失败,提示:不能添加一列子行,因为存在外键,相当于loan是字表,member是主表,子表中的外键列和主表中的约束失败,因为member中并不存在一个为2的外键值。

注意:物理外键一般不建议去创建,虽然它保证了数据的一致性,但也会带来维护成本,通常是开发去维护,根据逻辑外键去维护数据的一致性,有维护成本。

 

posted @ 2019-07-16 15:24  Abby_Bing  阅读(636)  评论(0编辑  收藏  举报