今天总算搞懂了RI (Referential Integrity) 引用完整性

今天总算搞懂了RI (Referential Integrity) 引用完整性

数据的完整性内容比较多,暂不谈,现只举个例子理解一下引用完整性

实例关系:多篇文章(Article)<归属于>某一类别(Class)

父子关系:一方为父多方为子

主外键关系:父方主键与子方外键关联

原理:父子关系是通过选定的键关联的,如果某一方的这个键变更了,而另一方不作更新,必然造成数据的不正确。如:文章实体用Class外键与类别实体的主键ClassId关联(更确切是文章实体聚合了类别实体),当某类别ID被改或者删除了,如果文章实体不作相应的操作,那么文章就不知道是哪个类别的了。

反之,文章的类别被改,那么文章的类别就可能会出错,当然系统允许改文章类别另当别论了。

可用事件:看图,父方只有UPDATE和DELETE事件,而子方只有INSERT和UPDATE事件,是因为,父方插入新记录(新的类别)不影响子方(现存文章)的数据完整性。反之,删除一篇文章不影响类别的数据完整性。这里要注意,事件的对象是关联双方的键。

可用规则:

  1. 父方:
    1. None:这个不用说了吧,什么都不干,当父方的主键被更改时;
    2. Restrict(限制):这个报错,不允许更改,当子方有相应的记录关联时;如,删除某一类别记录时,文章实体有该类别的文章。
    3. Cascade(级联):用得最多是这个了吧。级联更改子方相关记录。
    4. Set NULL:允许父方更改,子方外键设NULL,在某些场合有用。
    5. Set default:和上类似。
  2. 子方:
    1. None:这个不用说了吧,什么都不干,当子方的外键被更改时;
    2. Restrict(限制):这个报错,不允许更改,当父方没有相应的记录关联时;如,更改某篇文章的类别时,类别表没有相应的类别记录。

你可能感兴趣的:(技术_应用开发_数据库)