主外键关联,当删除的是父表数据,参照这些要删除的数据,Oracle有三种处理方式:

1、禁止删除,也是Oracle默认方法。

2、将参照要删除数据的子表对应数据置空。

3、将参照要删除数据的子表对应数据删除。

对于1,比较容易理解,不解释。

对于2,需要使用on delete set null建立外键约束。实验:

create table dept_test
(deptno number(10) not null,
 deptname varchar2(30) not null,
 constraint pk_dept_test primary key(deptno));

create table emp_test
(empno number(10) not null,
 fname varchar2(20) ,
 lname varchar2(20) ,
 dept number(10) ,
 constraint pk_emp_test primary key(empno));
alter table emp_test
add constraint fk_emp_dept_test foreign key(dept) references dept_test(deptno) on delete set null;
insert into dept_test values(1,'销售部');
insert into dept_test values(2,'财务部');
insert into emp_test values (2,'Mary',' Song',1);
insert into emp_test values (3,'Linda','Liu',2);
insert into emp_test values (4,'Linlin','Zhang',1);
delete from dept_test where deptno = 1;
1 row deleted.
SQL> select * from emp_test;
     EMPNO FNAME          LNAME                  DEPT
---------- -------------------- -------------------- ----------
     2 Mary           Song
     3 Linda          Liu                     2
     4 Linlin          Zhang

SQL> select * from dept_test;
    DEPTNO DEPTNAME
---------- ------------------------------
     2 财务部

可以看到emp_test中参照dept_test中deptno=1的两条记录对应dept值已经置为空。

SQL> truncate table emp_test;
Table truncated.

SQL> truncate table dept_test;
truncate table dept_test
               *
ERROR at line 1:
ORA-02266: unique/primary keys in table referenced by enabled foreign keys

此时也是禁止清空dept_test表,drop相同。

如果想要删除父表,可以有两种方法:

1、先drop子表,再drop父表。

2、先删除约束alter table emp_test drop constraint fk_emp_dept_test;,再drop父表。

对于3,需要使用on delete cascade建立外键约束。实验:

alter table emp_test
add constraint fk_emp_dept_test foreign key(dept) references dept_test(deptno) on delete cascade;
delete from dept_test where deptno = 1;
1 row deleted.
SQL> select * from dept_test;
    DEPTNO DEPTNAME
---------- ------------------------------
     2 财务部

SQL> select * from emp_test;
     EMPNO FNAME          LNAME                  DEPT
---------- -------------------- -------------------- ----------
     3 Linda          Liu                     2

可以看到子表中参照父表的行也被删除了。
SQL> truncate table emp_test;
Table truncated.

SQL> truncate table dept_test;
truncate table dept_test
               *
ERROR at line 1:
ORA-02266: unique/primary keys in table referenced by enabled foreign keys

这种删除表的和上面相同。

主外键关联删除(on delete set null和on delete cascade)相关推荐

  1. 转载:主外键关联删除(on delete set null和on delete cascade)

    本文对mysql也成立.把创建表的数据类型从oracle支持的换成mysql支持的就行了,即: number换成int, varchar2换成varchar. 创建外键后,表的结构为: CREATE ...

  2. Mysql中的外键分析(什么是外键,为什么要用外键,添加外键,主外键关联删除)

    有一个东西一直在我脑海中是个很烦的东西,但是这东西不搞清楚会阻碍自己的前进.自己做项目demo永远只能用一张表... 所以今天还是学习了下外键希望能够搞明白一些... 百度上搜索外键的作用" ...

  3. mysql 删除表数据_主外键关联表的数据删除策略

    说个题外话,我从来没想过会被拼多多这款软件所魔怔,他的这种社交营销的能力,实在是太强了,在怂恿之下,开始给儿子拼个这个, 各位有空帮砍下,https://w.url.cn/s/AzlPAB9,或者扫下 ...

  4. Mysql基础增删改查,主外键关联

    Mysql基础入门 章节导航 Mysql基础入门 创建 新增 删除 修改 查询 数据类型 主键 外键 数值计算 关联查询 1.登录mysql:mysql -uroot -p2.使用数据库: use 数 ...

  5. MySQL如何同时删除主外键关联的两张表中的数据

    1. 编写目的 介绍一种方法,解决如下问题:如何同时删除两张相关联的表的记录. 比如说表a的外键fk依赖于表a的id,现在我们需要删除id=5的两条数据. 2. 主要方法 为了简单,推荐更改表a的外键 ...

  6. oracle级联 drop,请教:oralce自带主外键级联删除的原理?

    從trace file看,應該是oracle internal的trigger實現這個級聯delete的. SQL> alter session set events '10046 trace ...

  7. oracle+cascade=gt;true,mysql数据库主外键级联删除脚本RESTRICT -- CASCADE

    在项目中,我们一般在数据库设计的时候做主外键关联设计,要么就不做.但是这样不符合规范,呵呵. 建立主外键关系的时候,默认是不能级联删除的.而出现往往在删除主表的数据时报错, 需要先删除从表然后再删除主 ...

  8. 存在外键关联的主表truncate如何做

    主外键是数据库提供的一种两表之间强制关联的方法,也可以从应用层实现. 优点 缺点 数据库实现的主外键 由数据库层机制保证,无需应用额外实现 强关联,不易扩展变更 应用实现的主外键 易扩展变更 完全由应 ...

  9. 数据库中主外键概念详细介绍

    关于数据库的主外键设置问题 一.主外键概念 主键 ​ 1.主键 ​ 简单而言,能够唯一的表示表中的每一行数据,这样的列属性称为表的主键,使用表主键可以保证实体的完整性,可对表内数据进行修改.删除时使用 ...

最新文章

  1. XXL-JOB v2.0.2,分布式任务调度平台 | 多项特性优化更新
  2. WORD2007中无法插入CMG文件
  3. linux按进程分配物理内存,linux下内存管理学习心得(一)
  4. 别让扁平化设计平淡无奇
  5. python 深度学习模型训练 多GPU下如何调用
  6. Cocos2d-x--Box2D绘制出两个矩形框的解决方案
  7. java 用户日志_2020年阿里巴巴最全Java、架构师、大数据、算法PPT技术栈图册
  8. 不解析,使用解析对象
  9. 关于小程序的一些坑的总结
  10. html:(16):a标签
  11. js 日期星期 带农历
  12. dc持久内存与mysql_Calypso Systems推出测试软件和服务器测试傲腾数据中心级持久内存...
  13. 在数据库中如何查询表的创建时间?
  14. python连乘函数_Python常用的几种常用的内置函数
  15. 目标检测——不同检测算法的对比的图表写作
  16. 助力企业实现新增长,腾讯企点发布全新数字化客户运营解决方案
  17. 字符集不同导致的ORA-00972
  18. NSDate 时间戳与字符串转换
  19. 微信开放平台接入支付后不显示头像
  20. 2014年9月CCF软考试题

热门文章

  1. Linux中cut命令的作用
  2. linux内核编程(hello world示例程序)
  3. java分布式服务框架Dubbo的介绍与使用
  4. 使用SQL Server管理数据表
  5. JAVA--建立一个可输入个人信息的窗口
  6. MySQL快速学习笔记(建议收藏)
  7. 安卓卡片式ViewPager
  8. android sd卡数据恢复,手机sd卡受损怎么办 手机内存卡数据恢复方法【详解】
  9. Express 极速掌握 1
  10. 如何用KiCad进行电路仿真