跟我一起学习MySQL技术内幕(第五版):(第二章学习日记11)

2.13外键和引用完整性

利用外键关系,可以在一个表里声明与另一个表里的某个索引相关联的索引,也可以把自己想要施加在表上的约束条件放到外键关系里。

外键的实际作用:
1.行插入:在score表与student表里 ,两个id外键联合后,就可以确保在插入成绩时
避免为不存在的学生输入成绩
2.删除(级联删除): 当两个表有外键联合时,如果删除一个表里的一行,删除操作
的效果会删除这两个表的与这行有关的对应行。
外键可以帮助我们维持数据的一致性,并且让他们用起来也很方便。在MySQl里。innoDB存储引擎提供了对外键的支持。这一节要介绍innodb表来实现外键的定义,即外键是如何影响表的使用方式。

首先,需要定义几条术语。
父表:包含原始键值的表
子表:它指的是引用了父表中键值的相关表

父表中的键值可以用来关联两个表。子表里的索引会引用父表里的索引。子表的索引值必须与父表中的索引值相匹配,或被设置为null值,以表明在父表里不存在与之对应的行。子表里的这个索引就是所谓的外键。

外键处在父表的外部,但他又包含了指向父表的值。

外键关系可以被设置为不接受null值,此时所有的外键值都必须与父表里的某个值行匹配。

innoDB存储引擎着重关注的外键定义成分包含下面这样几个:

1.constraint 子句:为外键约束提供一个名字
2.foreign key子句:列出子表里的索引列,必须与父表里的索引值相匹配
innodB为这个外间自动创建索引时,fk_name是外键id,即索引名
3.references 子句:列出父表及其索引列的名字,让子表里的外键可以引用他们。
它的index_column部分必须与外键关键字里的index_columns列数相同

4.on delete子句:可以用它来指定在删除父表里的行时,子表应该做什么。
没有这个子句,默认行为:拒绝从父表里删除仍被子表里的行所引用
的那些行
1>on delete no action子句和on delete restrict子句。对于innoDB,这两种语 句
一样,对于外键约束会立即检查
2>on delete cascade子句:删除父表的行时,子表里与之相关联的行也会被删除
掉。快速实现一个涉及多表的删除操作。
3>on delete set null 子句:删除父表的行时,子表里与之相关联的索引会被设置为
null。所以,想要使用这个选项,就必须定义所有有关
的子表索引列为允许null值。
4>on delete set default子句。(innoDB会将它报告为一个错误)

  1. on updata子句。用来指定,当更新父表里的行时,子表应该做什么,默认行为
    是:在子表里,拒绝执行那些会导致外键值在父表索引里无任何匹配的
    插入和更新操作。
    7.子表必须建立索引。外键列放在首位
    父表必须建立索引。references子句里的列放在首位。
    外键关系所涉及的两个两个表里的外键列必须被索引 。再定义外键关系之前,必须显示地创建父表的索引(innoDB会在子表里自动创建索引)

8.对应列数据类型兼容。

9.不能对外键关系里的字符串列进行前缀索引

p.s.:这几页文字竟然看了两个多小时,脱离代码的文字真不好看。。
后天的学习要写代码,这个不写记忆不深刻,

你可能感兴趣的:(mysql)