解析Oracle中多表级联删除的方法

表间的关系比较复杂,数据量又比较多,一个个删绝对会出大问题。于是实验了几种解决的办法,现小结一下。

方法一:创建约束时设定级联删除
(但一般由于各种原因或出于各种考虑在创建数据库时没有设定级联删除)
SQL语句:


代码如下:

CREATE TABLE "U_WEN_BOOK"."FARTAB" ("FAR_ID" NUMBER(10) NOT NULL,
"FAR_NAME" VARCHAR2(10), "OTHER_NAME" VARCHAR2(10),
CONSTRAINT "PK_FER" PRIMARY KEY("FAR_ID"))

CREATE TABLE "U_WEN_BOOK"."CHILTAB" ("CHIL_ID" NUMBER(10) NOT
    NULL, "CHIL_NAME" VARCHAR2(10), "CHIL_OTHER" VARCHAR2(10),
    "FAR_ID" NUMBER(10) NOT NULL,
    CONSTRAINT "PK_CHIL" PRIMARY KEY("CHIL_ID"),
    CONSTRAINT "FK_CHIL" FOREIGN KEY("FAR_ID")
REFERENCES "U_WEN_BOOK"."FARTAB"("FAR_ID") ON DELETE CASCADE)

方法二:创建约束时没有使用级联删除,在需要使用级联删除时,删除原来的外键约束,重建带级联删除的约束
(实验证明完全可行,注意需要对已经存在的数据进行验证,否则新建的约束对原有数据不具备效率,默认是验证的,若强制要求不验证,使用NOVALIDATE关键词。还有外键引用的只能是唯一主键)
SQL语句:


代码如下:

ALTER TABLE "U_WEN_BOOK"."GCHILTAB1"
    DROP CONSTRAINT "FK_G1"
ALTER TABLE "U_WEN_BOOK"."GCHILTAB1"
  ADD (CONSTRAINT "FK_G1" FOREIGN KEY()
    REFERENCES "U_WEN_BOOK"."CHILTAB"()
    ON DELETE CASCADE)
(这样就可以级联删除了,删除完后,如果不放心这样的约束条件,并且不嫌麻烦可以再重建为不带级联删除等外键约束,防止误操作)

方法三:使用触发器(创建时没有级联删除)
(比较灵活,可以根据自己编写的程序进行,引用的不是唯一主键也可以)
(1)创建表及插入数据
SQL语句:


代码如下:

create   table orderCombine   (  
O_Id                     VARCHAR2(16)     not   null,  
OrderId           VARCHAR2(15)     not   null,                        
FormerId         VARCHAR2(16)     not   null,  
constraint   PK_ORDERCOMBINE   primary   key   (FormerId) );
   create   table   VIPForm     (  
V_Id                     VARCHAR2(16)       not   null,              
IsValid           CHAR(1)   default   '0'     not   null     ,                  
Constraint fk_vipform foreign key(V_id)   references   ordercombine(formerid) );  
insert into orderCombine values('1','1','1'); insert into orderCombine values('2','2','2'); insert into vipform values('1','5'); insert into vipform values('2','4'); insert into vipform values('1','2');

结果:
(2)创建触发器:
SQL:


代码如下:

CREATE OR REPLACE TRIGGER "FG123"."TER_OV"
BEFORE
DELETE ON "ORDERCOMBINE" FOR EACH ROW
BEGIN
DELETE   FROM   VIPForm
WHERE   VIPForm.V_Id=:OLD.FormerId;
END;

(3)删除及结果:
SQL:


代码如下:

DELETE FROM "FG123"."ORDERCOMBINE"
WHERE FormerId ='1'

方法四:若表间关系简单(就两张表),涉及到的记录也很少(总共就几行记录),直接删除子表中的相关记录,再删除父表中的记录即可。
(前面的方法在涉及数据量较大以及表间关系比较复杂时才有效率上的优势,简单的直接删除来的更快)
如上例中,直接删除
SQL语句:


代码如下:

DELETE FROM "FG123"."ORDERCOMBINE"
WHERE VIPForm ='1';

DELETE FROM "FG123"."ORDERCOMBINE"
WHERE FormerId ='1'

(0)

相关推荐

  • Oracle多表级联更新详解

    用游标实现,我觉得绝对这种方法比较安全的.--首先定一个游标把需要用到的一些数据存放到游标中: 复制代码 代码如下: declare   CURSOR D_CURSOR_CUS_INFO IS    select t3.id_           as id_,           t3.owe_money_    as owe_money_,           a.heatingArea    as heating_area_    from T_CUS_OWE_MONEY_2 t2   

  • oracle 层次化查询(行政区划三级级联)

    前提: 数据库表DM_xzqh样例(部分): 复制代码 代码如下: DM MC 230000 黑龙江省 230100 哈尔滨市 230101 市辖区 230102 道里区 232700 大兴安岭 230103 南岗区 230104 道外区 230108 平房区 230109 松北区 230110 香坊区 230111 呼兰区 230112 阿城区 230123 依兰县 238000 农垦分局 230124 方正县 230125 宾县 230126 巴彦县 230127 木兰县 230128 通河

  • Oracle数据库中的级联查询、级联删除、级联更新操作教程

    级联查询 在ORACLE 数据库中有一种方法可以实现级联查询 select * //要查询的字段 from table //具有子接点ID与父接点ID的表 start with selfid=id //给定一个startid(字段名为子接点ID,及开始的ID号) connect by prior selfid=parentid //联接条件为子接点等于父接点,不能反 这个SQL主要用于菜单的级联查询,给一个父接点可以查出所有的子接点.及子接点的子接点,一查到底,很实用.不过呢这个程序只能在ora

  • 解析Oracle中多表级联删除的方法

    表间的关系比较复杂,数据量又比较多,一个个删绝对会出大问题.于是实验了几种解决的办法,现小结一下. 方法一:创建约束时设定级联删除(但一般由于各种原因或出于各种考虑在创建数据库时没有设定级联删除)SQL语句: 复制代码 代码如下: CREATE TABLE "U_WEN_BOOK"."FARTAB" ("FAR_ID" NUMBER(10) NOT NULL,"FAR_NAME" VARCHAR2(10), "OTH

  • redis中hash表内容删除的方法代码

    hash: Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象. Redis 中每个hash可以存储 232 - 1键值对(40多亿). 实例: 127.0.0.1:6379> HMSET runoobkey name "redis tutorial" description "redis basic commands for caching" likes 20 visitors 23000 OK 127.

  • Oracle中多表关联批量插入批量更新与批量删除操作

    该文章会分为三部分 1.多表关联批量插入 2.多表关联批量更新 3.多表关联批量删除 首先要明白一点,为什么会有批量这一个概念,无非就是数据太多了,在java端把数据查出来然后在按照100-300的批次进行更新太耗性能了,而且写出来的代码会非常的臃肿,所谓好的实现是用最少的,最精简的代码实现需求,代码越少,留给自己犯错误的机会更少. 还有一个知识点就是多表关联,对于查询肯定是可以多表关联的,其实对于除了查询之外也是可以进行多表关联过滤数据的,从而达到在Oracle中查到目标数据即可更新,从而规避

  • Oracle中scott表结构与简单查询实例分析

    本文实例讲述了Oracle中scott表结构与简单查询的方法.分享给大家供大家参考.具体分析如下: 1.scott用户的表的结构 查看表结构 desc 表名;//desc emp; emp表: SQL> desc emp; 名称 是否为空? 类型 ----------------- -------- ------------ EMPNO NOT NULL NUMBER(4) 雇员编号 ENAME VARCHAR2(10) 雇员姓名 JOB VARCHAR2(9) 雇员职位 MGR NUMBER(

  • Oracle Faq(如何在ORACLE中更改表的列名和顺序 )

    如需转载,请注明出处!用过ORACLE的人都知道,要想在ORACLE中更改表的列名和顺序可是一件很烦琐的事,下面给大家提供一种简单的方法. SQL> select object_id from all_objects where owner='SCOTT' and object_name='T1'; OBJECT_ID----------6067SQL> select obj#,col#,name from sys.col$ where obj#=6067; OBJ# COL#--------

  • ORACLE中关于表的一些特殊查询语句

    1: 如何判断字段的值里面:那些数据包含小写字母或大小字母 判断字段NAME的值里面有小写字母的记录 方式1: SELECT NAME FROM TEST WHERE regexp_like(NAME,'[[:lower:]]'); 方式2 SELECT NAME FROM TEST WHERE regexp_like(NAME,'[a-z]'); 判断字段NAME的值里面有大写字母的记录 方式1: SELECT NAME FROM TEST WHERE regexp_like(NAME,'[[

  • 在ORACLE中SELECT TOP N的实现方法

      1.在Oracle中实现SELECT TOP N 由于ORACLE不支持SELECT TOP语句,所以在ORACLE中经常是用ORDER BY跟ROWNUM的组合来实现SELECT TOP N的查询. 简单地说,实现方法如下所示: SELECT 列名1...列名n FROM (SELECT 列名1...列名n FROM 表名 ORDER BY 列名1...列名n) WHERE ROWNUM <= N(抽出记录数) ORDER BY ROWNUM ASC 下面举个例子简单说明一下. 顾客表cu

  • Python中顺序表原理与实现方法详解

    本文实例讲述了Python中顺序表原理与实现方法.分享给大家供大家参考,具体如下: Python中的顺序表 Python中的list和tuple两种类型采用了顺序表的实现技术,具有顺序表的所有性质. tuple是不可变类型,即不变的顺序表,因此不支持改变其内部状态的任何操作,而其他方面,则与list的性质类似. list的基本实现技术 Python标准类型list就是一种元素个数可变的线性表,可以加入和删除元素,并在各种操作中维持已有元素的顺序(即保序),而且还具有以下行为特征: 基于下标(位置

  • oracle中通配符和运算符的使用方法介绍

    用于where比较条件的有: 等于:=.<.<=.>.>=.<> 包含:in.not in exists.not exists 范围:between...and.not between....and 匹配测试:like.not like Null测试:is null.is not null 布尔链接:and.or.not 通配符: 在where子句中,通配符可与like条件一起使用.在Oracle中: %(百分号): 用来表示任意数量的字符,或者可能根本没有字符. _(

  • Yii中CGridView实现批量删除的方法

    本文实例讲述了Yii中CGridView实现批量删除的方法.分享给大家供大家参考,具体如下: 1. CGridView中的columns添加 array( 'selectableRows' => 2, 'footer' => '<button type="button" onclick="GetCheckbox();" style="width:76px">批量删除</button>', 'class' =&g

随机推荐