在主表记录发生变化导致外键参考的唯一约束值发生相应变化时,有如下处理方式:
限制(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默认没有实现。
本文详细介绍了在主表记录发生变化导致外键参考的唯一约束发生相应变化时,Oracle数据库中处理方式,包括限制(Restrict)、设为空(Set to null)、级联(Cascade)以及NoAction四种方式。
3368

被折叠的 条评论
为什么被折叠?



