oracle截断父表约束错误

qzlgjiam  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(340)

包含一些记录的父表。具有0条记录的子表b。
我有一个游标在这些表上按相反的树顺序进行截断(即先截断子表,然后截断父表),但是当我截断父表“ora-02266:unique/primary keys in table referenced by enabled foreign keys”错误时,仍然会遇到这个错误,尽管子表根本没有记录。
但是,当我以相同的顺序执行“delete from”时,所有与约束相关的错误都被避免了。“从中删除”需要很长时间才能运行。
我不想禁用或删除任何约束。

jgwigjjp

jgwigjjp1#

但是,当我以相同的顺序执行“delete from”时,所有与约束相关的错误都被避免了。
这是启用约束的唯一方法。不能截断。如果仍要截断表,则可以找到 constraint nameuser_constraints ,然后 DISABLE 他们:

ALTER TABLE table_name DISABLE CONSTRAINT constraint_name;

那你就可以了 TRUNCATE 并重新启用约束:

ALTER TABLE table_name ENABLE CONSTRAINT constraint_name;

如果你的table有 ON DELETE CASCADE 选项,然后从oracle 12.1 接下来,您可以使用:

TRUNCATE TABLE table_name CASCADE;

注意,两个 DELETE CASCADE 以及 TRUNCATE CASCADE 如果层次结构中的任何关系未使用 ON DELETE CASCADE 条款。

ryevplcw

ryevplcw2#

有三种方法可以从父/子表中删除:

CREATE TABLE par (i NUMBER CONSTRAINT par_pk PRIMARY KEY);
CREATE TABLE chi (i NUMBER CONSTRAINT chi_fk REFERENCES par(i) ON DELETE CASCADE);
INSERT INTO par VALUES(1);
INSERT INTO chi VALUES(1);

1) 如果您有oracle12或更高版本,并且外键 ON DELETE CASCADE ,您可以使用truncate cascade,我认为这是最快的选项:

TRUNCATE TABLE par CASCADE;
Table PAR truncated.

SELECT count(*) FROM par;
0

SELECT count(*) FROM chi;
0

2) 如果外键定义为 ON DELETE CASCADE ,您可以使用 DELETE ,我认为这是最慢的选择:

DELETE FROM par;
1 row deleted.

SELECT count(*) FROM par;
0

SELECT count(*) FROM chi;
0

3) 否则,可以禁用外键、截断表并重新启用外键。这很快,但比其他选项的风险要大一点(请检查约束是否都有效):

ALTER TABLE chi DISABLE CONSTRAINT chi_fk;
TRUNCATE TABLE chi;
TRUNCATE TABLE par;
ALTER TABLE chi ENABLE  CONSTRAINT chi_fk;

另外,不可能将外键从正常更改为 ON DELETE CASCADE . 我想你必须放弃并重新创造它们:

ALTER TABLE chi DROP CONSTRAINT chi_fk;
ALTER TABLE chi ADD  CONSTRAINT chi_fk REFERENCES par(i) ON DELETE CASCADE;

相关问题