Oracle Truncate Parent table 约束错误

Oracle Truncate Parent table constraint error

Parent table 有一些记录。 Child table B 有 0 条记录。

我有一个游标以反向树顺序对这些 table 执行 t运行cation(即首先 t运行cate child,然后 parent) 但是当我 t运行cate parent table 'ORA-02266: unique/primary keys in table referenced by enabled foreign keys' 错误时,我仍然收到这个错误,尽管 child table完全没有记录。

然而,当我以相同的顺序执行 'Delete from ' 时,所有与约束相关的错误都被避免了。 'Delete from' 需要很长时间才能达到 运行。

我不想禁用或删除任何约束。

However, when I do 'Delete from ' in the same order, all constraint related errors were avoided.

如果启用了约束,这是唯一的方法。你不能截断。如果您仍然想截断 table,那么您可以从 user_constraints 中找到 constraint name,然后 DISABLE 它们:

ALTER TABLE table_name DISABLE CONSTRAINT constraint_name;

然后您可以 TRUNCATE table,并重新启用约束:

ALTER TABLE table_name ENABLE CONSTRAINT constraint_name;

如果您的 table 有 ON DELETE CASCADE 选项,那么从 Oracle 12.1 开始,您可以使用:

TRUNCATE TABLE table_name CASCADE;

请注意,如果层次结构中的任何关系未使用 ON DELETE CASCADE 子句定义,DELETE CASCADETRUNCATE CASCADE 都将失败。

从 parent/child 个表中删除的方法有以下三种:

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) 如果你有 Oracle 12 或更高版本,并且你有带 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;

AFAIK,无法将外键从正常更改为 ON DELETE CASCADE。我猜你必须删除并重新创建它们:

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