1. 参照完整性
1.1. 定义参照完整性
CREATE TABLE ...
(SNO CHAR(9) NOT NULL/*主码不能是NULL*/
CNO CHAR(7) NOT NULL
.....
PRIMARY KEY (SNO,CNO)/*在表级定义实体完整性*/
FOREIGN KEY (SNO) REFERENCES Student(SNO)/*在表级定义参照完整性*/
FOREIGN KEY (CNO) REFERENCES Course(CNO)/*在表级定义参照完整性*/
)
1.2. 参照完整性检查和违约处理
被参照表(例如student) | 参照表(例如SC) | 若违约则处理方法 | 正常操作 |
---|---|---|---|
可能破坏参照完整性 <---- | --- 插入元组 | 拒绝 | (1) |
可能破坏参照完整性 <---- | --- 修改外码值 | 拒绝 | (2) |
删除元组 ----- | --->可能破坏参照完整性 | 拒绝/级联删除/设置为空值 | (3) |
修改主码值 ----- | --->可能破坏参照完整性 | 拒绝/级联修改/设置为空值 | (4) |
(1)SC表中增加一个元组,该元组的主码 SNO 属性值在student表中找不到一个元组使其 SNO 值与之相等
(2)修改SC表的一个元组,修改后该元组的主码 SNO 属性值在student表中找不到一个元组使其 SNO 值与之相等
(3)从student表中删除一个元组,造成SC表中某些元组的SNO属性值在student表中找不到一个元组,(其SNO属性值与被删除的相等)
(4)修改student表中一个元组的SNO属性值,造成SC表中某些元组的SNO属性值在student表中找不到一个元组,(其SNO属性值与被删除的相等)
当上述的不一致发生时,三种策略:
- 拒绝(NO ACTION):不允许该操作执行,该策略一般设置为默认策略
- 级联(CASCADE):当删除或者修改被参照表student的一个元祖导致与参照表SC的不一致时,删除或者修改参照表中所有导致不一致的元组 eg. 相当于同时删除student和SC表中的相同元组
- 设置为空值:当删除或者修改被参照表student的一个元祖导致与参照表SC的不一致时,将参照表中所有造成不一致的元组的对应属性值设置为 空值 。
eg.
CREATE TABLE SC
(SNO CHAR(9) NOT NULL/*主码不能是NULL*/
CNO CHAR(7) NOT NULL
Grade SMALLINT,
PRIMARY KEY (SNO,CNO)/*在表级定义实体完整性*/
FOREIGN KEY (SNO) REFERENCES Student(SNO)/*在表级定义参照完整性*/
ON DELETE CASCADE
/*当删除Student中的元组时,级联删除SC表中的相应元组*/
ON UPDATE CASCADE
/*当更新Student中的SNO时,级联更新SC表中的相应元组*/
FOREIGN KEY (CNO) REFERENCES Course(CNO)/*在表级定义参照完整性*/
ON DELETE NO ACTION
/*当删除Course表中的元组造成与SC表中的不一致时,拒绝删除*/
ON UPDATE CASCADE
/*当更新Student中的SNO时,级联更新SC表中的相应元组*/
)