Oracle外键约束的三种删除行为分别是:默认删除(No Action)、级联删除(Cascade)和置空删除(Set Null)。这三种行为定义了当主表(父表)中的记录被删除时,子表中对应外键的处理方式。
1、创建主表及子表并初始化数据
1.1、创建主表t_parent,并插入三条记录
hr@orcl> create table t_parent (parent_id int primary key, name varchar2(10)); hr@orcl> insert into t_parent values (1,'record1'); hr@orcl> insert into t_parent values (2,'record2'); hr@orcl> insert into t_parent values (3,'record3'); hr@orcl> commit; hr@orcl> select * from T_PARENT; PARENT_ID NAME ---------- ------------------------------ 1 record1 2 record2 3 record3
1.2、创建字表外键约束默认删除no action类型
hr@orcl> create table t_child1 (child1_id int primary key, parent_id int); hr@orcl> alter table t_child1 add constraint FK_t_child1 foreign key (parent_id) references t_parent (parent_id); hr@orcl> insert into t_child1 values (1,1); hr@orcl> commit; hr@orcl> select * from T_CHILD1; CHILD1_ID PARENT_ID ---------- ---------- 1 1
1.3、创建字表外键约束级联删除(Cascade)
hr@orcl> create table t_child2 (child2_id int primary key, parent_id int); hr@orcl> alter table t_child2 add constraint FK_t_child2 foreign key (parent_id) references t_parent (parent_id) on delete cascade; hr@orcl> insert into t_child2 values (2,2); hr@orcl> commit; hr@orcl> select * from T_CHILD2; CHILD2_ID PARENT_ID ---------- ---------- 2 2
1.4、创建字表外键约束置空删除(Set Null)
hr@orcl> create table t_child3 (child2_id int primary key, parent_id int); hr@orcl> alter table t_child3 add constraint FK_t_child3 foreign key (parent_id) references t_parent (parent_id) on delete set null; hr@orcl> insert into t_child3 values (3,3); hr@orcl> commit; hr@orcl> select * from T_CHILD3; CHILD2_ID PARENT_ID ---------- ---------- 3 3
2、三种删除行为
2.1、默认删除(No Action)
行为描述:
- 当在定义外键约束时使用No Action关键字(或者什么都不加,因为No Action是默认值),如果尝试删除主表中被外键引用的记录,Oracle将阻止这一操作,并返回错误,因为这将违反外键约束的完整性。
示例:
如果尝试删除主表T_PARENT
中PARENT_ID
为1的记录,而子表T_CHILD1
中存在引用该PARENT_ID
的记录,则删除操作将失败,并返回类似ORA-02292: integrity constraint (FK_T_CHILD1) violated - child record found
的错误。
hr@orcl> delete from T_PARENT where parent_id = 1; delete from T_PARENT where parent_id = 1 * ERROR at line 1: ORA-02292: integrity constraint (SEC.FK_T_CHILD1) violated - child record found hr@orcl> select * from T_CHILD1; CHILD1_ID PARENT_ID ---------- ---------- 1 1 在此类型下,不允许删除。
2.2、级联删除(Cascade)
行为描述:
- 当在定义外键约束时使用Cascade关键字,如果主表中被引用的记录被删除,那么子表中所有引用该记录的外键也将被自动删除。
示例:
如果主表T_PARENT
中PARENT_ID
为2的记录被删除,并且子表T_CHILD2
中存在引用该PARENT_ID
的记录,则这些记录也将被自动删除,以保持数据的一致性。
hr@orcl> delete from T_PARENT where parent_id = 2; 1 row deleted. hr@orcl> select * from T_CHILD2; no rows selected 成功,级联删除成功。
2.3、 置空删除(Set Null)
行为描述:
- 当在定义外键约束时使用Set Null关键字,如果主表中被引用的记录被删除,那么子表中所有引用该记录的外键将被设置为NULL。注意,这要求子表中的外键列允许NULL值。
示例:
如果主表T_PARENT
中PARENT_ID
为3的记录被删除,并且子表T_CHILD3
中存在引用该PARENT_ID
的记录,则这些记录中的PARENT_ID
将被设置为NULL。
hr@orcl> delete from T_PARENT where parent_id = 3; 1 row deleted. hr@orcl> select * from T_CHILD3; CHILD2_ID PARENT_ID ---------- ---------- 3
主表记录可以完成删除,子表中对应的内容被设置为NULL。
3、 总结
以上就是在Oracle数据库,当主表信息删除后对应的子表中记录的三种不同的处理方式,针对具体的应用场合请选择合适类型。
Oracle外键约束的三种删除行为为数据库设计提供了灵活性,可以根据实际需求选择合适的行为来维护数据的完整性和一致性。在实际应用中,应根据数据的依赖关系和业务逻辑来选择合适的删除行为。
以上信息基于Oracle数据库的外键约束行为,并参考了相关的技术文档和博客文章。需要注意的是,随着Oracle数据库版本的更新,某些细节和语法可能会有所变化,因此建议查阅最新的官方文档以获取最准确的信息。
到此这篇关于Oracle外键约束的三种删除行为小结的文章就介绍到这了,更多相关Oracle外键约束删除内容请搜索IT俱乐部以前的文章或继续浏览下面的相关文章希望大家以后多多支持IT俱乐部!