oracle中有外键约束的表怎么删除

2024-11-21 1

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)

行为描述

  • 当在定义外键约束时使用No Action关键字(或者什么都不加,因为No Action是默认值),如果尝试删除主表中被外键引用的记录,Oracle将阻止这一操作,并返回错误,因为这将违反外键约束的完整性。

示例

如果尝试删除主表T_PARENTPARENT_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)

行为描述

  • 当在定义外键约束时使用Cascade关键字,如果主表中被引用的记录被删除,那么子表中所有引用该记录的外键也将被自动删除。

示例

如果主表T_PARENTPARENT_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)

行为描述

  • 当在定义外键约束时使用Set Null关键字,如果主表中被引用的记录被删除,那么子表中所有引用该记录的外键将被设置为NULL。注意,这要求子表中的外键列允许NULL值。

示例

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