多表关系
外键
foreign key (所在表的字段) references 关联表(关联字段);
- 关联字段一般格式为——关联表_关联字段
通过外键来建立表与表之间的关系
以下使用的是关联表与被关联表
-
被关联表
-
被foreign绑定的表
-
关联表
- 有foreign字段的表
一对一
例子:人--身份证号码
没有级联关系下
- 创建表
- 必须先创建被关联表,才能创建关联表
- 添加数据
- 必须先添加被关联表的数据,关联表的外键才可以和被关联表的某条数据建立一对一的关系
- 修改数据
- 修改关联表的关联字段
- 如果被关联表的字段没有被其他字段关联就可以修改
- 修改被关联表的记录
- 如果被关联表的该条记录被关联了,就无法修改了
- 删除数据
- 删除关联表的记录
- 可以直接删除
- 删除被关联表
- 无法删除
- 要删除只能先删除关联表
级联关系下
- 创建表
- 和非级联关系一样
- 添加数据
- 和非级联关系一样
- 修改数据
- 修改关联表的关联字段
- 如果被关联表的字段没有被其他字段关联就可以修改
- 对被关联表无影响
- 修改被关联表的记录
- 无论被关联表的该条记录是否被关联了,都可以修改
- 如果被关联了,那么关联表的那条记录的外键内容会跟着修改
- 删除数据
- 删除关联表的记录
- 可以直接删除
- 对被关联表无影响
- 删除被关联表
- 无论被关联表的该条记录是否被关联了,都可以删除
- 如果被关联了,那么关联表的那条记录都会被删除
一对多
例子:户主--房子
外键必须放在多的一方,此时外键值不唯一
级联关系
- 创建表
- 必须先创建被关联表,才能创建关联表
- 添加数据
- 必须先添加被关联表的数据,关联表的外键才可以和被关联表的某条数据建立多对一的关系
- 修改数据
- 修改关联表的关联字段
- 只要关联表的记录里的外键字段指向的id存在就可以修改,且该字段不是唯一的
- 对被关联表无影响
- 修改被关联表的记录
- 无论被关联表的该条记录是否被关联了,都可以修改
- 如果被关联了,那么关联表的那条记录的外键内容会跟着修改
- 删除数据
- 删除关联表的记录
- 可以直接删除
- 对被关联表无影响
- 删除被关联表
- 无论被关联表的该条记录是否被关联了,都可以删除
- 如果被关联了,那么关联表的那条记录都会被删除
多对多
例子:课程--学生
因为外键的值最好是一个值,而不是多个值
所以一定要创建第三张表(关系表),每一个外键值不唯一,并且用多个外键建立联合唯一来确定这条数据的唯一性
级联关系下
- 因为是用第三张表建立的关系,
所以两张的任意操作对对方都没有影响,
但是会对关表长产生影响
- 但是创建是第三张关系表一定要最后创建
- 添加数据
- 两张被关联表的数据可以随便添加
- 但是关系表的数据的外键指向的内容一定要存在
- 修改数据
- 两张被关联表的数据可以随便添修改
- 但是修改时,关系表内所有和这条数据有关系的记录都会跟着修改
- 删除数据
- 两张表数据可以删除
- 但是删除时,关系所有和这条数据有关系的记都会被删除
非级联关系
提一下,因为被关系表的数据被关系表绑定了,所以无法修改,删除
- 正针对被绑定的记录
级联关系
级联的代码写在foreign内
级联更新
- on update cascade
- 作用:当被关联表的记录的被关联字段发生改变时,关联表中所用和这条记录有关系的记录的外键值会改变成一样的值
级联删除
- on delete cascade
- 作用:当被关联表的记录被删除时,关联表所有和这条记录有关系的都会被删除
级联与非级联的区别
- 针对被关联表
- 对关联表的操作都是一样的
- 针对修改记录和删除记录
- 只有在修改记录和删除记的时候不同
- 原来不让修改和删除的记录,都可以实现了
- 并且关联表的记录会跟着修改和删除
总结
- 建表一定建立级联关系
- 好处
- 自由度更高
- 表与表之间的设计更加合理,贴近实际