【TRUNCATE】在有外來鍵參照的表上無法使用TRUNCATE完成資料清理(ORA-02266)

secooler發表於2010-06-10
眾所周知,使用TRUNCATE方法可以非常快速的完成資料清理的任務,但在具有外來鍵參照的表上不可以簡簡單單的完成TRUNCATE的任務。
在具有外來鍵參照的表上完成TRUNCATE操作會收到報錯資訊“ORA-02266: unique/primary keys in table referenced by enabled foreign keys”。

簡單模擬一下這個報錯過程及處理方法。

1.建立主外來鍵參照表中的主表T_PARENT並初始化資料
sys@ora10g> conn sec/sec
Connected.
sec@ora10g> create table t_parent (parent_id int primary key, name varchar2(10));

Table created.

sec@ora10g> insert into t_parent values (1,'secooler1');

1 row created.

sec@ora10g> insert into t_parent values (2,'secooler2');

1 row created.

sec@ora10g> insert into t_parent values (3,'secooler3');

1 row created.

sec@ora10g> commit;

Commit complete.

sec@ora10g> select * from t_parent;

 PARENT_ID NAME
---------- ------------------------------
         1 secooler1
         2 secooler2
         3 secooler3

3 rows selected.

2.此時T_PARENT在沒有外來鍵參照的情況下是可以完成TRUNCATE操作的
sec@ora10g> truncate table t_parent;

Table truncated.

sec@ora10g> select * from t_parent;

no rows selected

3.建立參照主表T_PARENT的子表T_CHILD
sec@ora10g> create table t_child (child1_id int primary key, parent_id int);

Table created.

sec@ora10g> alter table t_child add constraint FK_t_child foreign key (parent_id) references t_parent (parent_id) on delete cascade;

Table altered.

sec@ora10g> insert into t_child values (1,1);

1 row created.

sec@ora10g> commit;

Commit complete.

sec@ora10g> select * from t_child;

 CHILD1_ID  PARENT_ID
---------- ----------
         1          1

4.此時如在具有外來鍵參照的T_PARENT表上使用TRUNCATE命令將無法完成
sec@ora10g> truncate table t_parent;
truncate table t_parent
               *
ERROR at line 1:
ORA-02266: unique/primary keys in table referenced by enabled foreign keys

5.處理方法
根本原因是因為外來鍵約束導致的,因此,如果執意要使用TRUNCATE完成資料的清理(知道操作的後果),僅需將約束disable即可。
sec@ora10g> alter table t_child disable constraint FK_t_child;

Table altered.

sec@ora10g> truncate table t_parent;

Table truncated.

6.小結
從約束完整性上考慮,在資料量比較少的情況下應該儘量使用delete方法進行資料清理。
但是,當資料量達到一定程度時,也許迫不得已必須使用TRUNCATE方法來完成資料的快速清理。在知道TRUNCATE後果的前提下它是一個非常優秀的工具。

Good luck.

secooler
10.06.10

-- The End --

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/519536/viewspace-664961/,如需轉載,請註明出處,否則將追究法律責任。

相關文章