Oracle使用外键来限制子表中参考的字段值,要求子表中的数据必须在主表中存在。当主表的记录发生变化时导致外键参考唯一约束值发生了变化时,Oracle指定了三种动作:默认值(类似于restrict)、delete cascade和delete set null。
实际体验一下他们对删除操作的不同效果。

1.创建主表及子表并简单初始化几条数据
1)创建主表t_parent,并初始化三条记录
sec@ora10g> create table t_parent (parent_id int primary key, name varchar2(10));
sec@ora10g> insert into t_parent values (1,'record1');
sec@ora10g> insert into t_parent values (2,'record2');
sec@ora10g> insert into t_parent values (3,'record3');
sec@ora10g> commit;

2)创建三种类型的子表t_child1、t_child2和t_child3
(1)no action类型
sec@ora10g> create table t_child1 (child1_id int primary key, parent_id int);
sec@ora10g> alter table t_child1 add constraint FK_t_child1 foreign key (parent_id) references t_parent (parent_id);
sec@ora10g> insert into t_child1 values (1,1);
sec@ora10g> commit;
(1)cascade类型
sec@ora10g> create table t_child2 (child2_id int primary key, parent_id int);
sec@ora10g> alter table t_child2 add constraint FK_t_child2 foreign key (parent_id) references t_parent (parent_id) on delete cascade;
sec@ora10g> insert into t_child2 values (2,2);
sec@ora10g> commit;
(1)set null类型
sec@ora10g> create table t_child3 (child2_id int primary key, parent_id int);
sec@ora10g> alter table t_child3 add constraint FK_t_child3 foreign key (parent_id) references t_parent (parent_id) on delete set null;
sec@ora10g> insert into t_child3 values (3,3);
sec@ora10g> commit;

2.确认主表和子表中的数据
sec@ora10g> select * from T_PARENT;

PARENT_ID NAME
---------- ------------------------------
         1 record1
         2 record2
         3 record3

sec@ora10g> select * from T_CHILD1;

CHILD1_ID  PARENT_ID
---------- ----------
         1          1

sec@ora10g> select * from T_CHILD2;

CHILD2_ID  PARENT_ID
---------- ----------
         2          2

sec@ora10g> select * from T_CHILD3;

CHILD2_ID  PARENT_ID
---------- ----------
         3          3

3.尝试对具有默认类型外键参照的主表记录进行删除
sec@ora10g> 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

sec@ora10g> select * from T_CHILD1;

CHILD1_ID  PARENT_ID
---------- ----------
         1          1

在此类型下,不允许删除。

4.尝试对具有delete cascade类型外键参照的主表记录进行删除
sec@ora10g> delete from T_PARENT where parent_id = 2;

1 row deleted.

sec@ora10g> select * from T_CHILD2;

no rows selected

成功,级联删除成功。

5.尝试对具有delete set null类型外键参照的主表记录进行删除
sec@ora10g> delete from T_PARENT where parent_id = 3;

1 row deleted.

sec@ora10g> select * from T_CHILD3;

CHILD2_ID  PARENT_ID
---------- ----------
         3

主表记录可以完成删除,子表中对应的内容被设置为NULL。

6.小结
以上就是在Oracle数据库,当主表信息删除后对应的子表中记录的三种不同的处理方式,针对具体的应用场合请选择合适类型。

Good luck.

secooler
10.03.21

-- The End --

【Foreign Key】Oracle外键约束三种删除行为相关推荐

  1. oracle 删除表数据 有外键约束,【Foreign Key】Oracle外键约束三种删除行为

    Oracle使用外键来限制子表中参考的字段值,要求子表中的数据必须在主表中存在.当主表的记录发生变化时导致外键参考唯一约束值发生了变化时,Oracle指定了三种动作:默认值(类似于restrict). ...

  2. oracle外键约束、级联删除

    根据约束名称查询: select * from user_constraints t where t.CONSTRAINT_NAME = '约束名称' 举例: 字段解析: 1.CONSTRAINT_N ...

  3. oracle 外键约束 权限,ORACLE外键约束(FORIGEN KEY)

    外键约束的定义是,让另一张表的记录来约束自己.这里的另一张表就是主表. 当主表的记录删除时,我们可以跟随主表删除记录(ON DELETE CASCADE).或者相应字段设置为空(ON DELETE S ...

  4. 小议Oracle外键约束修改行为

    小议Oracle外键约束修改行为(一) Oracle的外键用来限制子表中参考的字段的值,必须在主表中存在.而且在主表的记录发生变化导致外键参考唯一约束值发生了变化时,定义了一系列的动作. 在SQL92 ...

  5. oracle能不能改外键属性,CSS_小议Oracle外键约束修改行为(五), Oracle的外键用来限制子表 - phpStudy...

    小议Oracle外键约束修改行为(五) Oracle的外键用来限制子表中参考的字段的值,必须在主表中存在.而且在主表的记录发生变化导致外键参考唯一约束值发生了变化时,定义了一系列的动作. 前面几篇文章 ...

  6. oracle 建立外键 引用条件约束 不能添加,Oracle外键约束

    一.创建外键约束 两种方法 1.创建表时 create table 子表( id number, name varchar2(5), foreign key(id) references 父表(列名) ...

  7. oracle外键约束强行insert,oracle 禁用外键约束

    1.ORACLE数据库中的外键约束名都在表user_constraints中可以查到.其中constraint_type='R'表示是外键约束. 2.启用外键约束的命令为:alter table ta ...

  8. oracle外键约束怎么删除,mysql oracle 删除外键约束

    oracle 删除外键约束 禁用约束 启用约束 oracle 删除外键约束 禁用约束 启用约束 执行以下sql生成的语句即可 删除所有外键约束 Sql代码  select 'alter table ' ...

  9. Oracle 外键约束

    添加主键约束: ALTER TABLE GA_AIRLINE ADD CONSTRAINT PK_AIRLINE_ID PRIMARY KEY(AIRLINE_ID); 有三种形式的外键约束: 1.普 ...

最新文章

  1. 交叉验证(cross validation)是什么?K折交叉验证(k-fold crossValidation)是什么?
  2. 武汉一高中14名学生被剑桥牛津预录取!逻辑思路比结果更重要
  3. zabbix企业应用之固定端口监控redis
  4. 《卓有成效的管理者》——读书笔记
  5. 机器学习之正则化图文讲解
  6. 面向站长和网站管理员的Web缓存加速指南
  7. 深度好文:Linux操作系统内存
  8. iphone怎样关闭副屏_小米新设计专利曝光:“Z”型折叠屏手机
  9. linux let s证书续期,BT(宝塔面板)Let’s Encrypt证书续签方法
  10. 安全领域多位世界级权威的智慧结晶——《黑客新型攻击防范:深入剖析犯罪软件》...
  11. 【干货】2021年重点行业薪酬趋势指南.pdf(附下载链接)
  12. 生产环境中CentOS5.6下配置LVS(续)
  13. Linux 环境下思源黑体字体与 Java 之间的兼容性问题的解决
  14. 三维空间中直线间距离的计算
  15. 服务器阵列卡缓存显示错误,服务器阵列卡(缓存)
  16. 互联网-3互联网思维的应用
  17. python average函数详解_python基础之函数详解
  18. SPA 项目 之 后台接口文档
  19. 研究生哪些行为可以在导师那超加分?
  20. 用python写情书_《使用Python进行自然语言处理》学习笔记一 | 学步园

热门文章

  1. python下载的文件放在哪里的-python实现文件下载的方法总结
  2. mybatis中sqlSession的设计与实现
  3. Button的使用(六):ToggleButton
  4. HDU2093 考试排名
  5. linux文件目录详细介绍
  6. bzoj 1864: [Zjoi2006]三色二叉树
  7. android脚步---使用framelayout实现霓虹灯效果
  8. C语言语法之运算符及优先级
  9. 奥巴马就职委员会选择微软Silverlight技术
  10. 今夜,我又坐在电脑面前想你