最简单快速的删除
下面要讲到了涉及多表级联删除到数据量较大以及表间关系比较复杂时才有效率上的优势,简单的直接删除来的更快
如上例中,直接删除
代码如下 | 复制代码 |
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) |
(这样就可以级联删除了,删除完后,如果不放心这样的约束条件,并且不嫌麻烦可以再重建为不带级联删除等外键约束,防止误操作)