详谈关系数据库中的“键”(续2)

来源:互联网 发布:死鱼一样的老婆知乎 编辑:程序博客网 时间:2024/06/06 12:52

详谈关系数据库中的“键”(续)

 今天我们来讨论外键。

   从表通过指向主表的外键来与主表相关联。人们常犯的一种错误是:认为参照完整性是对于主键的约束。但实际上,参照完整性要求的是外键值必须引用有效的主键值,所以这项约束是对于外键的约束,而不是对于主键的约束。
T-SQL脚本中,可以使用两种方法来声明完整性约束:既可以在创建表的代码中声明完整性约束,也可以在创建表之后再创建约束。其声明的格式如下:
  ForeignKeyColumn FOREIGN KEY REFERENCES PrimaryTable(PKID)
      可选的外键与强制的外键之间存在着很大的区别。一些关系的外键必须具有值,但对于其他一些关系就不必如此,无论外键有值或者没有值,其数据都是有效的。在物理层,这种差别是通过外键列能否为空体现出来的。如果外键是强制的,那么外键列就不能允许输入空值。相反,可选的外键,在相应的列上允许输入空值。对于具有复杂的可选性的关系,将需要通过Check约束或者触发器来全面地维护这种关系。
       由参照完整性所带来的一种复杂性是:如果从表中的记录引用了主表中的一行记录,那么RI(Referential Integrity)将阻止对这一行记录进行删除操作,除非从表中引用了它的记录都被删除了。否则,如果删除了主表中的这一行记录,而从表中的那些记录行仍旧指向这个刚被删除的记录的主键值,参照完整性就被破坏了。
       解决这个问题的一种方法就是做级联删除操作。它将把主表中的记录及其相关的从表中的记录一起删除,删除的顺序是:首先删除从表中的相关记录,然后再删除主表中的记录,因此它能够维护参照完整性。在T-SQL代码中启用级联删除选项的方法如下:
    FOREIGN KEY REFERENCES dbo.[TABLENAME] ON DELETE CASCADE
       在确定对于某个外键是否要采用级联删除选项时,可以使用以下由实践中总结出来的原则:
        1. 如果从表中的数据必须与主表中的数据结合在一起才有意义,一旦脱离了主表中的数据便毫无意义,那么应当使用级联删除。
        2. 如果从表中的数据具有它自己的含义,那么就不应该使用级联删除。
        3. 如果外键是可选的,那么永远也不要使用级联删除。