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 CASCADE
和 TRUNCATE 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;
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 CASCADE
和 TRUNCATE 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;