`
yzhming
  • 浏览: 33181 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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中多表级联删除的方法

    方法一:创建约束时设定级联删除(但一般由于各种原因或出于各种考虑在创建数据库时没有设定级联删除)SQL语句: 代码如下:CREATE TABLE “U_WEN_BOOK”.”FARTAB” (“FAR_ID” NUMBER(10) NOT NULL,“FAR_NAME” ...

    oracle表空间替换转移级联删除脚本生成工具

    1.可以扫描oracle导出的dmp文件中的表空间信息,然后替换为指定的表空间名,要以将多个表空间名转换为一个表空间名 2.可以进行常规的一些导入导出新建数据库操作 3.可以生成包含子表的按条件删除的脚本,维护数据时...

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

    里整理了Oracle中的三种级联操作,其中Oracle定义外健的时候可以定义级联删除,但是没有级联修改的语法,当然可以用触发器实现,下面我们详细来看Oracle数据库中的级联查询、级联删除、级联更新操作教程

    21天学通Oracle

    6.2.3 级联更新与级联删除 100 6.2.4 修改外键属性 102 6.2.5 外键使用 104 6.3 唯一性约束 105 6.3.1 唯一性约束简介 105 6.3.2 创建唯一性约束 105 6.3.3 修改唯一性约束 107 6.3.4 唯一性约束的使用 108 ...

    非常全的oracle文档

    3.2. Oracle的卸载、删除 9 四、 Oracle体系结构 10 4.1. 体系结构 10 4.2. 会话 11 4.3. 内存结构 11 4.4. Oracle 实例进程结构 12 4.5. Oracle 物理组件 13 4.6. Oracle 逻辑组件 13 4.7. 模式 15 4.8. 数据文件...

    oracle_dynamic_sql.rar_Dynamic SQL ORAC_oracle_oracle dynam_orac

    介绍了在oracle里,如何使用动态SQL,如何进行级联删除,文件中举例阐述了实现方法

    数据库oracle 学习笔记重点总结

    数据库,oracle ,强制删除,系列,事物控制,级联删除,sql,sqlpuls

    zhangsanlzh#Solutions#oracle常用操作命令1

    1、创建表空间 2、创建用户并授权 3、导出数据库到桌面 4、导入dmp文件到数据库 5、登录数据库 6、级联删除用户所有数据 7、删除表空间

    mysql数据库的基本操作语法

    级联删除:删除主表的数据时,关联的从表数据也删除,则需要在建立外键约束的后面增加on deletecascade 或on delete set null,前者是级联删除,后者是将从表的关联列的值设置为null。 create table student( id int...

    Hibernate注解

    很奇怪),分别是CascadeType.PERSIST(级联新建),CascadeType.REMOVE(级联删除),CascadeType.REFRESH(级联刷新),CascadeType.MERGE(级联更新),CascadeType.ALL(全部四项) * 方法一 * 主表: ?@OneToOne...

    风越asp代码生成器 V3.5

    10、支持自动生成多组多级的级联下拉框功能,快速建立如:省、市、县/公司、部门、小组等形式下拉框 ★ 11、支持表单提交超过100KB的文本数据 ★ 12、支持多文件上载、修改、删除记录时同步删除文件 13、支持控件名...

    asp.net知识库

    可按任意字段排序的分页存储过程(不用临时表的方法,不看全文会后悔) 常用sql存储过程集锦 存储过程中实现类似split功能(charindex) 通过查询系统表得到纵向的表结构 将数据库表中的数据生成Insert脚本的存储过程!!! ...

    风越.Net代码生成器 [FireCode Creator] V1.3 精简版

    10、支持自动生成多组多级的级联下拉框功能,快速建立如:省、市、县/公司、部门、小组等形式下拉框 ★ 11、支持表单提交超过100KB的文本数据 ★ 12、支持多文件上载、修改、删除记录时同步删除文件 13、支持控件名...

    风越.net代码生成器 v3.5

    10、支持自动生成多组多级的级联下拉框功能,快速建立如:省、市、县/公司、部门、小组等形式下拉框 ★ 11、支持表单提交超过100KB的文本数据 ★ 12、支持多文件上载、修改、删除记录时同步删除文件 13、支持控件名...

    javaweb博客网站

    1.用的struts2,数据库用的Oracle11g,DAO用的DBUtils,富文本用的百度的UEditor 2.界面风格是仿照博客园的,其实就是扒下来的,所以html有点乱,将就看吧 3.数据库没设计好,外键直接引用的主键属性,所以没做级联...

    DBJ.jar:一个开放源代码库,用于替换本机JDBC协议,DBJ.jar可以轻松地通过某种方法连接到数据库,因此用户必须在功能中提供凭据和参数,DBJ才能处理其余部分(连接,驱动程序管理器,准备的声明,结果集等)

    DBJ.jar 一个用于替换本机...不具有连接对象的GetAll,具有/不具有连接对象的特定字段)@Overloading 更新类(尚未实施) 删除类(尚未实施) 触发器类(尚未实现) 事务的级联回滚(尚未实现)连接类(包com.dbj.con

Global site tag (gtag.js) - Google Analytics