级联删除即删除包含主键值的行的操作,该值由其它表的现有行中的外键列引用。在级联删除中,还删除其外键值引用删除的主键值的所有行。

语法:

Foreign Key

(column[,...n])

references referenced_table_name[(ref_column[,...n])]

[on delete cascade]

[on update cascade]

  

注释:

column:列名

referenced_table_name:外键参考的主键表名称

ref_name:外键要参考的表的主键列

on delete:删除级联

on update:更新级联

SQL级联删除——删除主表同时删除从表——同时删除具有主外键关系的表

实例学习:

create table a

(

id varchar(20) primary key,

password varchar(20) not null

)

  

create table b

(

id int identity(1,1) primary key,

name varchar(50) not null,

userId varchar(20),

foreign key (userId) references a(id) on delete cascade

)

  

表B创建了外码userId 对应A的主码ID,声明了级联删除。

测试数据:

insert a values ('11','aaa')
insert a values('23','aaa')
insert b values('da','11')
insert b values('das','11')
insert b values('ww','23')

  

删除A表内id为‘11’的数据,发现B表内userId 为“11”也被数据库自动删除了,这就是级联删除

delete a where id='11'

  

oracle中级联删除

使用on delete cascade和on delete set null来建立外键 。

其面我们介绍了创建外键约束时如果使用oracle默认的创建方式,在删除被参照的数据时,将无法被删除,这一点在oracle9i中给了我们更多灵活的选择,我们可是使用on delete cascade和 on delete set null关键字来决定删除被参照数据时是否要将参照这个数据的那些数据一并删除,还是将那些参照这条数据的数据的对应值赋空。

例如下面这两个表中分别存的时员工的基本信息和公司的部门信息。我们为

create table dept
(deptno number(10) not null,
deptname varchar2(30) not null,
constraint pk_dept primary key(deptno));
和
create table emp
( empno number(10) not null,
fname varchar2(20) ,
lname varchar2(20) ,
dept number(10) ,
constraint pk_emp primary key(empno)); 

然后我们现在分别使用这两个关键字来增加外键试一下,首先我们来试一下on delete cascade

alter table emp
add constraint fk_emp_dept foreign key(dept) references dept(deptno) on delete cascade;

 

先增加外键。然后插入数据。

insert into dept values(1,’销售部’);
insert into dept values(2,’财务部’);
insert into emp values (2,’Mary’,'Song’,1);
insert into emp values (3,’Linda’,'Liu’,2);
insert into emp values (4,’Linlin’,'Zhang’,1);

  

然后现在我要删除销售部,
delete from dept where deptno = 1; 
我们发现除了dept中的一条数据被删除了,emp中两条数据也被删除了,其中emp中的两条数据是参照了销售部的这条数据的,这就很容易理解on delete cascade了。

接下来我们再来看on delete set null,顾名思义了,这种方式建立的外键约束,当被参照的数据被删除是,参照该数据的那些数据的对应值将会变为空值,下面我们还是通过试验来证明on delete set null作用: 
首先恢复刚才的那几条数据,然后更改约束:

alter table emp
add constraint fk_emp_dept foreign key(dept) references dept(deptno) on delete set null;

  

然后我们在执行删除操作: 
delete from dept where deptno = 1; 
你也会发现除了dept中的销售部被删除以外,emp中参照这条数据的两条数据的dept的值被自动赋空了,这就是on delete set null的作用了。

使用on delete set null有一点需要注意的是,被参参照其他表的那一列必须能够被赋空,不能有not null约束,对于上面的例子来说是emp中dept列一定不能有not null约束,如果已经定义了not null约束,又使用了on delete set null来删除被参照的数据时,将会发生:ORA-01407: 无法更新 (”DD”.”EMP”.”DEPT”) 为 NULL的错误。

总的来讲on delete cascade和on delete set null的作用是用来处理级联删除问题的,如果你需要删除的数据被其他数据所参照,那么你应该决定到底希望oracle怎么处理那些参照这些即将要删除数据的数据的,你可以有三种方式: 
禁止删除,这也是oracle默认的;
将那些参照本值的数据的对应列赋空,这个需要使用on delete set null关键字;
将那些参照本值的数据一并删除,这个需要使用on delete cascade关键字;

Oracle如何操作级联删除的更多相关文章

  1. Oracle外键级联删除和级联更新

    https://www.2cto.com/database/201507/417496.html

  2. oracle系列--级联删除和级联更新

    必须声明:此博客转载于Oracle外键级联删除和级联更新http://www.2cto.com/database/201507/417496.html 鉴于此前收藏的精彩博客无料被删除了,很是痛心,所 ...

  3. sql级联删除

    原文:sql级联删除 功能:在删除主表时,自动删除副表(外键约束)相应内容 删除包含主键值的行的操作,该值由其它表的现有行中的外键列引用.在级联删除中,还删除其外键值引用删除的主键值的所有行. 如: ...

  4. oracle级联更新与级联删除

    Oracle级联删除:可以使用外键约束来实现,建立表的主外键关系,给列设置级联删除.如下: ——创建了CLASS表,并设置ID字段为主键. -- Create tablecreate table CL ...

  5. Oracle 级联删除

    alter table ForeignTable(附表)add constraint fk_MainTable_ForeignTable(关联表中的外键) foreign key(ForeignTab ...

  6. iOS CoreData 的级联删除等操作

    关于CoreData 的基本操作在网上有一些中文资料,但是这些资料大多没有涉及CoreData的详细操作,只是简单的演示了最基本用法.像级联删除这种最基本的数据库操作都没有提到.今天在网上看到了一些英 ...

  7. 30)django-ORM(元信息,级联删除,正反向操作,连表查询优化)

    一:元信息 class User(models.Model): name=models.CharField(max_length,index=True) email=model.CharField(m ...

  8. ORACLE 11gR2 RAC添加删除(正常及强制)节点操作步骤(删除篇)

    ORACLE 11gR2 RAC添加删除(正常及强制)节点操作步骤(删除篇) 本文主要转载 [  http://www.cnxdug.org/?p=2511 ] 有部分细节自己实验添加,再此谢谢前辈. ...

  9. oracle级联删除

    oracle级联删除可以使用触发器来实现,但是比较麻烦,最简单的就是直接建立表的主外键关系,给列设置级联删除. ------创建了CLASS表,并设置ID字段为主键. -- Create table ...

随机推荐

  1. Android日志服务 记录日志

    转: http://easion-zms.iteye.com/blog/981568 import java.io.BufferedReader; import java.io.File; impor ...

  2. js的基础学习

    alert() 函数在 JavaScript 中并不常用,但它对于代码测试非常方便. <!DOCTYPE html> <html> <body> <h1> ...

  3. Bookmarklet

    学习 http://www.ruanyifeng.com/blog/2011/06/a_guide_for_writing_bookmarklet.html

  4. Swift语言简介+快速上手

    相关: Xcode 6 beta:https://developer.apple.com/xcode/downloads/ swift语言学习文档英文版:http://pan.baidu.com/s/ ...

  5. ICMP Internet控制报文协议

    ICMP是(Internet Control Message Protocol)Internet控制报文协议.它是TCP/IP协议族的一个子协议,用于在IP主机.路由器之间传递控制消息.控制消息是指网 ...

  6. Quartz.net开源作业调度框架使用详解(转)

    前言 quartz.net作业调度框架是伟大组织OpenSymphony开发的quartz scheduler项目的.net延伸移植版本.支持 cron-like表达式,集群,数据库.功能性能强大更不 ...

  7. [转载]Using ngOptions In AngularJS

    http://odetocode.com/blogs/scott/archive/2013/06/19/using-ngoptions-in-angularjs.aspx?utm_source=tui ...

  8. ASP.NET中利用DataList实现图片无缝滚动

    这个问题之前也困扰我,后来解决了,拿出来分享下,以后用也方便,代码很容易看懂,不多说什么了 <div id="demo" style="overflow: hidd ...

  9. [Effective JavaScript 笔记] 第2条:理解JavaScript的浮点数

    JavaScript数值型类型只有数字 js只有一种数值型数据类型,不管是整数还是浮点数,js都把归为数字. typeof 17;   // “number” typeof 98.6; // “num ...

  10. NGUI 图集生成 图片Sprite 有撕裂边的问题

    修改 Dimensions 的 X 和 Y值进行调整. 在生成图集时 选择Padding 设置1以上 应该不会出现这个问题.