【TRUNCATE】在有外來鍵參照的表上無法使用TRUNCATE完成資料清理(ORA-02266)
眾所周知,使用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 --
在具有外來鍵參照的表上完成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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- truncate有外來鍵約束的表,報ORA-02266處理。
- Oracle大表清理truncate .. reuse storageOracle
- 使用ODU恢復被truncate表的資料
- Mysql truncate table時解決外來鍵關聯MySql
- 使用hellodba的工具恢復truncate表的資料
- Truncate資料表背後的幾個引數(上)
- 使用ODU恢復oracle被truncate的表資料Oracle
- TRUNCATE資料恢復資料恢復
- oracle truncate table recover(oracle 如何拯救誤操作truncate的表)Oracle
- 恢復被執行truncate table的表資料
- 資料庫關鍵詞 drop、truncate和delete的用法資料庫delete
- truncate 命令使用
- 表管理之四:刪除資料Delete與truncate的使用區別delete
- Truncate資料表背後的幾個引數(下)
- SQL資料庫中Truncate的用法SQL資料庫
- 大資料表的truncate,列刪除,shrink回收高水位大資料
- Oracle Truncate表恢復(ODU)Oracle
- 【資料庫資料恢復】如何恢復Oracle資料庫truncate表的資料資料庫資料恢復Oracle
- 資料庫:drop、truncate、delete的區別資料庫delete
- Sqlserver 如何truncate linked server的表SQLServer
- 揭祕Oracle資料庫truncate原理Oracle資料庫
- TRUNCATE in postgresqlSQL
- 分割槽表truncate慢處理
- oracle logminer恢復truncate table的資料Oracle
- 為什麼當刪除整個表中的資料時,需使用TRUNCATE代替DELETEdelete
- MySQL資料災難挽救之truncate tableMySql
- truncate table 誤刪除資料後的恢復
- truncate表後恢復方法總結
- MySQL truncate原理MySql
- Truncate 大量資料(1.5 億)用時30秒
- 解決無法刪除表,提示被外來鍵約束引用
- truncate delete 的區別delete
- MySQL 用隨機資料填充外來鍵表MySql隨機
- oracle恢復表delete/truncate/drop的方法總結Oracledelete
- Diffrence Between delete and truncatedelete
- truncate 比 delete 慢delete
- drop、delete 與truncatedelete
- SQL – TRUNCATE vs DELETESQLdelete