在主表记录发生变化导致外键参考的唯一约束值发生相应变化时,有如下处理方式:
限制(Restrict):主表记录发生变化(删除、更新)时,如果子表中存在相应外键值,则不允许删除。oracle实现时会报ora-02292错误,提示用户违反完整性约束 - 找到子记录。该处理方式为oracle默认的外键约束处理方式。另外,oracle实现了一种可以延迟检查约束的处理方式 - No action。这种方式和限制方式的区别在于检查发生在变化语句执行之后。
Restrict:
设为空值(set to null):主表记录发生变化(删除、更新)时,如果字表中存在相应外键值,则设置为空值null。虽然oracle支持set to null,但是只是实现了DELETE语句,而没有实现UPDATE语句,这和SQL标准的定义是有区别的。
set to null:
级联(cascade):主表记录发生变化(删除、更新)时,如果字表中存在相应外键值,则进行相应变化。和set to null约束一样,cascade操作也是只对DELETE语句有效,而对于UPDATE语句不起作用。和set to null不同cascade具有传递性,主表删除一条记录,会导致子表参考的记录被删除,而子表的记录被删除又会导致子表的子表记录被删除。
cascade:
以上仅为oracle已实现的各种外键约束处理方式。级联更新、设为默认值等处理方式可通过触发器+存储过程的方式实现。oracle默认没有实现。
限制(Restrict):主表记录发生变化(删除、更新)时,如果子表中存在相应外键值,则不允许删除。oracle实现时会报ora-02292错误,提示用户违反完整性约束 - 找到子记录。该处理方式为oracle默认的外键约束处理方式。另外,oracle实现了一种可以延迟检查约束的处理方式 - No action。这种方式和限制方式的区别在于检查发生在变化语句执行之后。
Restrict:
alter table tabsub add constraint C_FK foreign key(mid) references tabmain(mid);
No Action:
alter table tabsub add constraint C_FK foreign key(mid) references tabmain(mid) deferrable initially deferred;
设为空值(set to null):主表记录发生变化(删除、更新)时,如果字表中存在相应外键值,则设置为空值null。虽然oracle支持set to null,但是只是实现了DELETE语句,而没有实现UPDATE语句,这和SQL标准的定义是有区别的。
set to null:
alter table tabsub add constraint C_FK foreign key(mid) references tabmain(mid) on delete set null;
级联(cascade):主表记录发生变化(删除、更新)时,如果字表中存在相应外键值,则进行相应变化。和set to null约束一样,cascade操作也是只对DELETE语句有效,而对于UPDATE语句不起作用。和set to null不同cascade具有传递性,主表删除一条记录,会导致子表参考的记录被删除,而子表的记录被删除又会导致子表的子表记录被删除。
cascade:
alter table tabsub add constraint C_FK foreign key(mid) references tabmain(mid) on delete cascade;
以上仅为oracle已实现的各种外键约束处理方式。级联更新、设为默认值等处理方式可通过触发器+存储过程的方式实现。oracle默认没有实现。