多表关系

外键

foreign key (所在表的字段) references 关联表(关联字段);

  • 关联字段一般格式为——关联表_关联字段

通过外键来建立表与表之间的关系

以下使用的是关联表与被关联表

  • 被关联表

  • 被foreign绑定的表

  • 关联表

    • 有foreign字段的表

一对一

例子:人--身份证号码

没有级联关系下

- 创建表
  - 必须先创建被关联表,才能创建关联表
- 添加数据
  - 必须先添加被关联表的数据,关联表的外键才可以和被关联表的某条数据建立一对一的关系
- 修改数据
  - 修改关联表的关联字段
    - 如果被关联表的字段没有被其他字段关联就可以修改
  - 修改被关联表的记录
    - 如果被关联表的该条记录被关联了,就无法修改了
- 删除数据
  - 删除关联表的记录
    - 可以直接删除
  - 删除被关联表
    - 无法删除
    - 要删除只能先删除关联表

级联关系下

- 创建表
  - 和非级联关系一样
- 添加数据
  - 和非级联关系一样
- 修改数据
  - 修改关联表的关联字段
    - 如果被关联表的字段没有被其他字段关联就可以修改
    - 对被关联表无影响
  - 修改被关联表的记录
    - 无论被关联表的该条记录是否被关联了,都可以修改
    - 如果被关联了,那么关联表的那条记录的外键内容会跟着修改
- 删除数据
  - 删除关联表的记录
    - 可以直接删除
    - 对被关联表无影响
  - 删除被关联表
    - 无论被关联表的该条记录是否被关联了,都可以删除
    - 如果被关联了,那么关联表的那条记录都会被删除

一对多

例子:户主--房子

外键必须放在多的一方,此时外键值不唯一

级联关系

- 创建表
  - 必须先创建被关联表,才能创建关联表
- 添加数据
  - 必须先添加被关联表的数据,关联表的外键才可以和被关联表的某条数据建立多对一的关系
- 修改数据
  - 修改关联表的关联字段
    - 只要关联表的记录里的外键字段指向的id存在就可以修改,且该字段不是唯一的
    - 对被关联表无影响
  - 修改被关联表的记录
    - 无论被关联表的该条记录是否被关联了,都可以修改
    - 如果被关联了,那么关联表的那条记录的外键内容会跟着修改
- 删除数据
  - 删除关联表的记录
    - 可以直接删除
    - 对被关联表无影响
  - 删除被关联表
    - 无论被关联表的该条记录是否被关联了,都可以删除
    - 如果被关联了,那么关联表的那条记录都会被删除

多对多

例子:课程--学生

因为外键的值最好是一个值,而不是多个值

所以一定要创建第三张表(关系表),每一个外键值不唯一,并且用多个外键建立联合唯一来确定这条数据的唯一性

级联关系下

- 因为是用第三张表建立的关系,
  所以两张的任意操作对对方都没有影响,
  但是会对关表长产生影响
- 但是创建是第三张关系表一定要最后创建
- 添加数据
  - 两张被关联表的数据可以随便添加
  - 但是关系表的数据的外键指向的内容一定要存在
- 修改数据
  - 两张被关联表的数据可以随便添修改
  - 但是修改时,关系表内所有和这条数据有关系的记录都会跟着修改
- 删除数据
  - 两张表数据可以删除
  - 但是删除时,关系所有和这条数据有关系的记都会被删除

非级联关系

提一下,因为被关系表的数据被关系表绑定了,所以无法修改,删除

- 正针对被绑定的记录

级联关系

级联的代码写在foreign内

级联更新

  • on update cascade
  • 作用:当被关联表的记录的被关联字段发生改变时,关联表中所用和这条记录有关系的记录的外键值会改变成一样的值

级联删除

  • on delete cascade
  • 作用:当被关联表的记录被删除时,关联表所有和这条记录有关系的都会被删除

级联与非级联的区别

  • 针对被关联表
    • 对关联表的操作都是一样的
  • 针对修改记录和删除记录
    • 只有在修改记录和删除记的时候不同
    • 原来不让修改和删除的记录,都可以实现了
    • 并且关联表的记录会跟着修改和删除

总结

  • 建表一定建立级联关系
  • 好处
    • 自由度更高
    • 表与表之间的设计更加合理,贴近实际

PS:外键本身可以不唯一,但是外键关联的字段一定唯一

posted @ 2019-10-29 20:31  ~李  阅读(177)  评论(0编辑  收藏  举报