您当前的位置: 首页 > 数据库教程 > Oracle教程 > 解析Oracle中多表级联删除的方法

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

作者:不详 来源:网络 发布时间: 2014-08-26 22:33 点击:
创建数据库时为了防止其他人不小心删除操作错误, 所有的外键都没有加级联删除。哪知,不知什么时候自己入了一批错误的数据进去,入库使用的是软件自动的,一下点错给自己带来无尽麻烦啊,删除就不好办了 表间的关系比较复杂,数据量又比较多,一个个删绝对会出大问题

解析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'
分享到:
本文"解析Oracle中多表级联删除的方法"由远航站长收集整理而来,仅供大家学习与参考使用。更多网站制作教程尽在远航站长站。
顶一下
(0)
0%
踩一下
(0)
0%
[点击 次] [返回上一页] [打印]
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 密码: 验证码:
关于本站 - 联系我们 - 网站声明 - 友情连接- 网站地图 - 站点地图 - 返回顶部
Copyright © 2007-2013 www.yhzhan.com(远航站长). All Rights Reserved .
远航站长:为中小站长提供最佳的学习与交流平台,提供网页制作与网站编程等各类网站制作教程.
官方QQ:445490277 网站群:26680406 网站备案号:豫ICP备07500620号-4