创建数据库时为了防止其他人不小心删除操作错误
所有的外键都没有加级联删除
哪知
不知什么时候自己入了一批错误的数据进去
入库使用的是软件自动的
一下点错给自己带来无尽麻烦啊
删除就不好办了
表间的关系比较复杂数据量又比较多一个个删绝对会出大问题于是实验了几种解决的办法现小结一下
方法一创建约束时设定级联删除
(但一般由于各种原因或出于各种考虑在创建数据库时没有设定级联删除)
SQL语句
复制代码 代码如下:
CREATE TABLE "U_WEN_BOOK"
"FARTAB" ("FAR_ID" NUMBER(
) NOT NULL
"FAR_NAME" VARCHAR
(
)
"OTHER_NAME" VARCHAR
(
)
CONSTRAINT "PK_FER" PRIMARY KEY("FAR_ID"))
CREATE TABLE "U_WEN_BOOK"
"CHILTAB" ("CHIL_ID" NUMBER(
) NOT
NULL
"CHIL_NAME" VARCHAR
(
)
"CHIL_OTHER" VARCHAR
(
)
"FAR_ID" NUMBER(
) 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"
"GCHILTAB
"
DROP CONSTRAINT "FK_G
"
ALTER TABLE "U_WEN_BOOK"
"GCHILTAB
"
ADD (CONSTRAINT "FK_G
" FOREIGN KEY()
REFERENCES "U_WEN_BOOK"
"CHILTAB"()
ON DELETE CASCADE)
(这样就可以级联删除了
删除完后
如果不放心这样的约束条件
并且不嫌麻烦可以再重建为不带级联删除等外键约束
防止误操作)
方法三使用触发器(创建时没有级联删除)
(比较灵活可以根据自己编写的程序进行引用的不是唯一主键也可以)
()创建表及插入数据
SQL语句
复制代码 代码如下:
create table orderCombine (
O_Id VARCHAR
(
) not null
OrderId VARCHAR
(
) not null
FormerId VARCHAR
(
) not null
constraint PK_ORDERCOMBINE primary key (FormerId) );
create table VIPForm (
V_Id VARCHAR
(
) not null
IsValid CHAR(
) default
not null
Constraint fk_vipform foreign key(V_id) references ordercombine(formerid) );
insert into orderCombine values(
); insert into orderCombine values(
); insert into vipform values(
); insert into vipform values(
); insert into vipform values(
);
结果
()创建触发器
SQL
复制代码 代码如下:
CREATE OR REPLACE TRIGGER "FG
"
"TER_OV"
BEFORE
DELETE ON "ORDERCOMBINE" FOR EACH ROW
BEGIN
DELETE FROM VIPForm
WHERE VIPForm
V_Id=:OLD
FormerId;
END;
()删除及结果
SQL
复制代码 代码如下:
DELETE FROM "FG
"
"ORDERCOMBINE"
WHERE FormerId =
方法四若表间关系简单(就两张表)涉及到的记录也很少(总共就几行记录)直接删除子表中的相关记录再删除父表中的记录即可
(前面的方法在涉及数据量较大以及表间关系比较复杂时才有效率上的优势简单的直接删除来的更快)
如上例中直接删除
SQL语句
复制代码 代码如下:
DELETE FROM "FG""ORDERCOMBINE"
WHERE VIPForm =
DELETE FROM "FG""ORDERCOMBINE"
WHERE FormerId =