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属性值与被删除的相等)

当上述的不一致发生时,三种策略:

  1. 拒绝(NO ACTION):不允许该操作执行,该策略一般设置为默认策略
  2. 级联(CASCADE):当删除或者修改被参照表student的一个元祖导致与参照表SC的不一致时,删除或者修改参照表中所有导致不一致的元组 eg. 相当于同时删除student和SC表中的相同元组
  3. 设置为空值:当删除或者修改被参照表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表中的相应元组*/
 )

results matching ""

    No results matching ""