Oracle外键级联更新——延迟约束和触发器实现


Oracle外键只有级联删除没有级联更新,但是有时候系统中可能需要这样的功能,所以这里记录下实现过程。

Oracle中的约束有两种方式,一种是延迟约束,一种是非延迟约束。所谓的非延迟约束就是说更改记录的时候会立刻进行约束条件的查看,是否因为违反了某些约束条件而不能执行修改,而延迟约束则表示不会再刚进行修改的时候进行约束查看,只有提交的时候才会检查。Oracle的级联更新就是使用这个特性来实现的。

1、首先建立外键的时候设置为延迟约束。具体的语句如下:

ALTER TABLE TEST_2 ADD CONSTRAINT TEST_2_TEST_1_FK1 FOREIGN KEY (FKID) REFERENCES TEST_1(ID) ON DELETE CASCADE DEFERRABLE;  

就是为TEST_2表增加外键,引用到TEST_1上,并且设置为级联删除和延迟约束(DEFERREABLE)。如果是使用了Oracle的Sql Developer工具,可以在约束条件一栏查看是否设置成功。

2、然后设置触发器

在TEST_1表上设置触发器,当表的主键改变了就级联的更新表TEST_2中对应的字段。

  1. CREATE OR REPLACE  
  2. TRIGGER TEST_UPDATE   
  3. AFTER UPDATE ON TEST_1   
  4. FOR EACH ROW  
  5. BEGIN  
  6.   IF :OLD.ID<>:NEW.ID THEN  
  7.     UPDATE TEST_2 SET FKID=:NEW.ID WHERE FKID=:OLD.ID;  
  8.   END IF;  
  9. END;  

经过1和2两步就可以实现外键的级联更新了。基本思想就是在更新主表主键的时候进行了延迟约束,不会立刻检查,而触发器在更新之后就会级联更新附表的外键,然后提交,这是会进行约束检查,由于外键已经级联更新过了,所以这里不会有问题。

相关内容