详谈关系数据库中的“键”(续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. 如果外键是可选的,那么永远也不要使用级联删除。
- 详谈关系数据库中的“键”(续2)
- 详谈关系数据库中的“键”(续1)
- 详谈关系数据库中的“键”
- 关系数据库中的“键”
- 求关系模式中的候选键(软考,数据库)
- 详谈数据库的锁
- 详谈数据库事务
- 数据库中的关系运算
- 数据库中的关系运算
- 关系数据库中的概念
- 数据库中关系代数中的关系运算
- MySQL数据库优化经验详谈
- MySQL数据库优化经验详谈
- MySQL数据库优化经验详谈
- MySQL数据库优化经验详谈
- Oracle数据库(关系型数据库2)
- 关系数据库中的几个范式
- 关系数据库中的三范式
- 技術人員轉型秘笈 - 全文版 ifly 提供
- java连接sql2000的配置方法
- 腾讯的本地协议
- Dreamweaver和Struts的整合
- Tatoos 11 Arteam By Shub-nigurrath
- 详谈关系数据库中的“键”(续2)
- 使用自由軟件的日子
- 终于搞定了DirectInput中的FOREGROUND
- struts的国际化
- 如何使用 SQL JSP 标准库
- 最近的intern招聘流水账
- JSP Standard Tag Libraries 实践理解
- struts的检验
- struts中的javascript