oracle系列--级联删除和级联更新
必须声明:此博客转载于Oracle外键级联删除和级联更新http://www.2cto.com/database/201507/417496.html
鉴于此前收藏的精彩博客无料被删除了,很是痛心,所以还是要复制一下
一、级联删除
Oracle在外键的删除上有NO ACTION(类似RESTRICT)、CASCADE和SET NULL三种行为。
下面以学生-班级为例说明不同情况下的外键删除,学生属于班级,班级的主键是学生的外键。
-- 班级表
CRATE TABLE TB_CLASS
(
ID NUMBER NOT NULL, --班级主键
NAME VARCHAR2(50), --班级名称
CONSTRAINT PK_TB_CLASS PRIMARY KEY (ID)
); -- 学生表
CREATE TABLE TB_STUDENT
(
ID NUMBER NOT NULL, --学生主键
NAME VARCHAR2(50), --学生姓名
CLASS_ID NUMBER, --学生所属班级,外键 --主键约束
CONSTRAINT PK_TB_STUDENT PRIMARY KEY (ID), --外键约束
--设置级联删除为NO ACTION
CONSTRAINT FK_TB_STUDENT_CLASS_ID FOREIGN KEY (CLASS_ID) REFERENCES TB_CLASS (ID)
); -- 添加班级数据
INSERT INTO TB_CLASS (ID, NAME) VALUES (1, '一班');
INSERT INTO TB_CLASS (ID, NAME) VALUES (2, '二班');
INSERT INTO TB_CLASS (ID, NAME) VALUES (3, '三班'); -- 添加学生数据
INSERT INTO TB_STUDENT (ID, NAME, CLASS_ID) VALUES (1, '小明', 1);
INSERT INTO TB_STUDENT (ID, NAME, CLASS_ID) VALUES (2, '小刚', 1);
INSERT INTO TB_STUDENT (ID, NAME, CLASS_ID) VALUES (3, '小王', 1);
INSERT INTO TB_STUDENT (ID, NAME, CLASS_ID) VALUES (4, '二明', 2);
INSERT INTO TB_STUDENT (ID, NAME, CLASS_ID) VALUES (5, '二刚', 2);
INSERT INTO TB_STUDENT (ID, NAME, CLASS_ID) VALUES (6, '二王', 2);
INSERT INTO TB_STUDENT (ID, NAME, CLASS_ID) VALUES (7, '大明', 3);
INSERT INTO TB_STUDENT (ID, NAME, CLASS_ID) VALUES (8, '大刚', 3);
INSERT INTO TB_STUDENT (ID, NAME, CLASS_ID) VALUES (9, '大王', 3);
1、NO ACTION
NO ACTION指当删除主表中被引用列的数据时,如果子表的引用列中包含该值,则禁止该操作执行。
现在学生外键级联删除是NO ACTION,执行删除班级操作。
2、SET NULL
SET NULL指当删除主表中被引用列的数据时,将子表中相应引用列的值设置为NULL值。SET NULL有个前提就是外键引用列必须可以设置为NULL。
把学生表(TB_STUDENT)的外键删除行为改为SET NULL。ORACLE似乎没有MODIFY CONSTRAINT操作,只能先删除外键,然后创建新的。
3、CASCADE
CASCADE指当删除主表中被引用列的数据时,级联删除子表中相应的数据行。
把学生表(TB_STUDENT)的外键删除行为改为CASCADE。
二、级联更新
Oracle本身并不支持外键的级联更新,不过可以按照如下方法达到级联更新的效果。
首先要先了解Oracle延迟约束和非延迟约束。非延迟约束就是在修改记录的时候会立刻进行约束条件的查看,是否因为违反了某些约束条件而不能执行修改。延迟约束不会在刚进行修改的时候进行约束查看,只有提交的时候才会检查。Oracle的级联更新就是使用这个特性来实现的。
Oracle的外键默认是非延迟约束,修改学生的外键为延迟约束。
--删除学生表(TB_STUDENT)上的已有外键
ALTER TABLE TB_STUDENT DROP CONSTRAINT FK_TB_STUDENT_CLASS_ID;
--添加延迟约束外键
ALTER TABLE TB_STUDENT ADD CONSTRAINT FK_TB_STUDENT_CLASS_ID FOREIGN KEY (CLASS_ID) REFERENCES TB_CLASS (ID) ON DELETE CASCADE DEFERRABLE;
设置触发器,当班级表(TB_CLASS)的主键改变了,就更新学生表(TB_STUDENT)的外键(CLASS_ID)。
CREATE OR REPLACE TRIGGER TGR_TB_CLASS_UPDATE
AFTER UPDATE OF ID ON TB_CLASS
FOR EACH ROW
BEGIN
IF :OLD.ID<>:NEW.ID THEN
UPDATE TB_STUDENT SET CLASS_ID=:NEW.ID WHERE CLASS_ID=:OLD.ID;
END IF;
END;
oracle系列--级联删除和级联更新的更多相关文章
- [NHibernate]一对多关系(级联删除,级联添加)
目录 写在前面 文档与系列文章 一对多关系 一个例子 级联删除 级联保存 总结 写在前面 在前面的文章中,我们只使用了一个Customer类进行举例,而在客户.订单.产品中它们的关系,咱们并没有涉及, ...
- 【Python】Django数据模型、级联删除、级联更新、ER图导出等
在本文中,我们将向读者详细介绍如何在更新和删除父表数据的同时,触发有关子表数据的级联更新和删除操作.您将看到当使用InnoDB表的时候,借助于外键约束就可以轻松搞定这一过程. 一.利用外键约束更新并删 ...
- sqlserver 级联删除、级联更新
增加外键约束时,设置级联更新.级联删除:[ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ][ ON UPDATE { NO A ...
- MySQL之级联删除、级联更新、级联置空
1. 准备测试表 # 专业表major ))engine=innodb default charset=utf8; # 学生表mstudent ), major int)engine=innodb d ...
- Oracle外键级联删除和级联更新
https://www.2cto.com/database/201507/417496.html
- MySQL级联删除和级联修改
1.新建主键table create table demo1_zhujian ( id int primary key auto_increment, name )); 2.新建外键table cre ...
- oracle级联更新与级联删除
Oracle级联删除:可以使用外键约束来实现,建立表的主外键关系,给列设置级联删除.如下: ——创建了CLASS表,并设置ID字段为主键. -- Create tablecreate table CL ...
- Oracle如何操作级联删除
级联删除即删除包含主键值的行的操作,该值由其它表的现有行中的外键列引用.在级联删除中,还删除其外键值引用删除的主键值的所有行. 语法: Foreign Key (column[,...n]) refe ...
- hibernate 级联删除报更新失败的问题(org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update)
首先hibernate级联删除的前提是,首先需要在映射文件中配置,配置多表之间的关联关系: 下面以部门表(Dept)和员工表(Emp)为例: 1.在Emp.hbm.xml映射文件中配置many-to- ...
随机推荐
- SGU_390_Tickets(另类数位DP)
Tickets Time Limit : 1000/500ms (Java/Other) Memory Limit : 524288/262144K (Java/Other) Total Subm ...
- Windows修改hosts文件及位置
文件位置 C:\Windows\System32\drivers\etc 中的hosts文件 修改方式 指定IP 域名 192.168.66.7 www.baidu.com
- Linux链接VPN进行转发
1.安装client sudo apt-get install pptp-linux 2.连接vpn server sudo pptpsetup --create pptpd --server x.x ...
- 加工生产调度(prod)
加工生产调度(prod) 题目描述 有n个部件需在A.B机器上加工,每个工件都必须经过先A后B两道工序. 已知:部件i在A.B机器上的加工时间分别为ai,bi. 问:如何安排n个工件的加工顺序,才能使 ...
- OpenGL学习-------绘制简单的几何图形
本次课程所要讲的是绘制简单的几何图形,在实际绘制之前,让我们先熟悉一些概念. 一.点.直线和多边形我们知道数学(具体的说,是几何学)中有点.直线和多边形的概念,但这些概念在计算机中会有所不同.数学上的 ...
- 简单 实现CombineFileInputFormat
import java.io.DataOutput; import java.io.IOException; import org.apache.hadoop.conf.Configuration ...
- HDU 2485 Destroying the bus stations
2015 ACM / ICPC 北京站 热身赛 C题 #include<cstdio> #include<cstring> #include<cmath> #inc ...
- java项目开发第六天——天若有情天亦老,人间正道是沧桑
今天讲解的东西是数据库连接,一天下来还是相对轻松的,这个组长也是够轻松的,队员加载的界面自己也是导入不了,最后也是不了了之,还是加油赶赶吧.看看严嘉那组的界面,最后就是呵呵.但是学长看完后(研究生,同 ...
- springMVC 静态文件 访问
1. 新建web project 2. 导入所需jar包 3. 更改web.xml <?xml version="1.0" encoding="UTF-8" ...
- 使用bootstrap响应式布局——手机屏幕中横向滚动显示标签页选项
导航栏到小屏幕的时候,我们的处理办法是隐藏为一个按钮.可是选项卡的标签页部分,我们的处理办法是加一个水平滚动条.但是加水平滚动条需要解决一个问题,就是宽度的问题,如果不设置宽度,他就会根据屏幕大小自适 ...