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数据库版本的更新,某些细节和语法可能会有所变化,因此建议查阅最新的官方文档以获取最准确的信息。