Oracle外键约束的三种删除行为分别是:默认删除(No Action)、级联删除(Cascade)和置空删除(Set Null)。这三种行为定义了当主表(父表)中的记录被删除时,子表中对应外键的处理方式。
1、创建主表及子表并初始化数据
1.1、创建主表t_parent,并插入三条记录
1 2 3 4 5 6 7 8 9 10 11 12 | 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类型
1 2 3 4 5 6 7 8 9 | 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)
1 2 3 4 5 6 7 8 9 | 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)
1 2 3 4 5 6 7 8 9 | 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)
行为描述:
示例:
如果尝试删除主表T_PARENT
中PARENT_ID
为1的记录,而子表T_CHILD1
中存在引用该PARENT_ID
的记录,则删除操作将失败,并返回类似ORA-02292: integrity constraint (FK_T_CHILD1) violated - child record found
的错误。
1 2 3 4 5 6 7 8 9 10 11 | 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)
行为描述:
示例:
如果主表T_PARENT
中PARENT_ID
为2的记录被删除,并且子表T_CHILD2
中存在引用该PARENT_ID
的记录,则这些记录也将被自动删除,以保持数据的一致性。
1 2 3 4 5 6 | 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)
行为描述:
示例:
如果主表T_PARENT
中PARENT_ID
为3的记录被删除,并且子表T_CHILD3
中存在引用该PARENT_ID
的记录,则这些记录中的PARENT_ID
将被设置为NULL。
1 2 3 4 5 6 7 | 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数据库版本的更新,某些细节和语法可能会有所变化,因此建议查阅最新的官方文档以获取最准确的信息。