Oracle中多表级联删除的语句总结

最简单快速的删除

下面要讲到了涉及多表级联删除到数据量较大以及表间关系比较复杂时才有效率上的优势,简单的直接删除来的更快
    
如上例中,直接删除

 代码如下 复制代码
    
DELETE FROM "FG123"."ORDERCOMBINE"
    
WHERE VIPForm =’1’;
    
DELETE FROM "FG123"."ORDERCOMBINE"
    
WHERE FormerId =’1’;

方法一:创建约束时设定级联删除

Oracle 级联删除使用格式:

 代码如下 复制代码
CREATE TABLE A001(ID INT PRIMAY KEY,NAME VARCHAR2(20)) 
CREATE TABLE A002(ID INT REFERENCES A001(ID)ON DELETE CASCADE,AGE NUMBER(2,0)) 
CREATE TABLE groups 

id VARCHAR2(16) CONSTRAINT pk_groupid PRIMARY KEY, 
name VARCHAR2(32), 
description VARCHAR2(50) 

TABLESPACE userspace; 
CREATE TABLE usringrp 

group_id VARCHAR2(16) CONSTRAINT fk_uing_grpid 
REFERENCES groups(id) 
ON DELETE CASCADE, 
user_id VARCHAR2(16) 

TABLESPACE userspace; 
PowerDesigner 

参照完整性约束

限制(Restrict)。不允许进行修改或删除操作。若修改或删除主表的主键时,如果子表中存在子记录,系统将产生一个错误提示。这是缺省的参照完整性设置。
置空(Set Null)。如果Oracle外键列允许为空,若修改或删除主表的主键时,把子表中参照的外键列设置为空值(NULL)。
置为缺省(Set Default)。如果指定了缺省值,若修改或删除主表的主键时,把子表中参照的Oracle外键设置为缺省值(Default)。
级联(Cascade)。把主表中主键修改为一个新的值时,相应修改子表中Oracle外键的值;或者删除主表中主键的记录时,要相应删除子表中外键的记录。

 代码如下 复制代码

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)

(这样就可以级联删除了,删除完后,如果不放心这样的约束条件,并且不嫌麻烦可以再重建为不带级联删除等外键约束,防止误操作)

时间: 2024-08-02 08:24:01

Oracle中多表级联删除的语句总结的相关文章

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

创建数据库时为了防止其他人不小心删除操作错误, 所有的外键都没有加级联删除.哪知,不知什么时候自己入了一批错误的数据进去,入库使用的是软件自动的,一下点错给自己带来无尽麻烦啊,删除就不好办了   表间的关系比较复杂,数据量又比较多,一个个删绝对会出大问题.于是实验了几种解决的办法,现小结一下. 方法一:创建约束时设定级联删除(但一般由于各种原因或出于各种考虑在创建数据库时没有设定级联删除)SQL语句: 复制代码 代码如下: CREATE TABLE "U_WEN_BOOK"."

关于java判断oracle中的表是否存在,不存在则创建一个表的问题

问题描述 关于java判断oracle中的表是否存在,不存在则创建一个表的问题 代码如下try{ Class.forName(""oracle.jdbc.driver.OracleDriver""); String url = ""jdbc:oracle:thin:@""+localhost+"":""+port+"":""+dbname; con

如何获取oracle中某表的字段类型。

问题描述 如何获取oracle中某表的字段类型. 解决方案 使用JDBC就可以的// 获取数据库的连接这些操作我就省了PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM H_TEST");ResultSet rs = pstmt.executeQuery();ResultSetMetaData rsmd = rs.getMetaData(); //获取字段名if(rsmd != null){ int count

用sqoop将oracle中的表导入hadoop出现如图问题 求解决方案!

问题描述 用sqoop将oracle中的表导入hadoop出现如图问题 求解决方案! 解决方案 http://www.linuxidc.com/Linux/2014-02/96678.htm 照这个链接再搞一下 解决方案二: 我当初就是照他的方案弄得 不知道为什么连接不上去

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

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#-

mysql-java里面怎么将oracle中的表存到txt文档中

问题描述 java里面怎么将oracle中的表存到txt文档中 通过java连接上数据库以后.怎么讲数据库中的整张表通过流写入到txt文档中.具体用那个流,请大神写下详细代码.谢谢 解决方案 http://download.csdn.net/detail/ceolaoda/8961205 解决方案二: 先获取数据库数据,然后创建对应路径下的txt文件,然后写入对应的数据字符串. 创建类然后在里面写如下方法测试: //操作一:向文件里面写入数据 //方法一. // FileWriter fw =

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

如需转载,请注明出处!用过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中dual表的用途介绍

导读]dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录.我们可以用它来做很多事情. dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录.我们可以用它来做很多事情,如下: 1.查看当前用户,可以在 SQL Plus中执行下面语句 select user from dual; 2.用来调用系统函数 select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from

oracle中截断表的使用介绍_oracle

在Oracle中如果删除了表中的某一条数据,还可以通过回滚操作(rollback)进行回滚,假如想清空一张 表的数据,但是又不想使其能进行回滚操作,就可以立刻释放资源,这时就需要使用截断表了.它的主要功能就是彻底删除数据,使其不能进行回滚.这里我打个比方大家就立刻能明了它的作用.大家众所周知,当我们在自己的PC(personcomputer)上删除某一个文件,它并没有彻底删除而是进入了回收站,你要在回收站中再将其删除才算彻底清除.截断表就相当于直接将数据从pc上删除,而不会放入回收站. 截断表格