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个文件。文件的名字与表名相同。拓展名为frm、MYD、MYI。其实,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的外键值。
注意:物理外键一般不建议去创建,虽然它保证了数据的一致性,但也会带来维护成本,通常是开发去维护,根据逻辑外键去维护数据的一致性,有维护成本。