【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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Mysql truncate table時解決外來鍵關聯MySql
- oracle truncate table recover(oracle 如何拯救誤操作truncate的表)Oracle
- 資料庫關鍵詞 drop、truncate和delete的用法資料庫delete
- SQL資料庫中Truncate的用法SQL資料庫
- Sqlserver 如何truncate linked server的表SQLServer
- 資料庫:drop、truncate、delete的區別資料庫delete
- 【資料庫資料恢復】如何恢復Oracle資料庫truncate表的資料資料庫資料恢復Oracle
- 分割槽表truncate慢處理
- MySQL資料災難挽救之truncate tableMySql
- MySQL truncate原理MySql
- 如何在Linux中使用 Truncate 命令Linux
- truncate table (tablename )表明
- openGauss lo_truncate
- kingbase——建立truncate函式函式
- 【資料庫資料恢復】Oracle資料庫誤truncate table的資料恢復案例資料庫資料恢復Oracle
- 【資料庫資料恢復】誤truncate table的Oracle資料庫資料恢復方案資料庫資料恢復Oracle
- 【北亞資料恢復】誤操作導致雲伺服器表被truncate,表內資料被delete的資料恢復資料恢復伺服器delete
- mysql 大表drop和truncate 技術風險點MySql
- MySQL 用隨機資料填充外來鍵表MySql隨機
- delete和truncate刪除的區別delete
- 【資料庫資料恢復】oracle資料庫誤truncate table怎麼恢復資料?資料庫資料恢復Oracle
- undo truncate 導致qps下降分析
- [20180627]truncate table的另類恢復.txt
- 在MySQL中 Truncate Delect Drop 的區別MySql
- SQLSERVER 的 truncate 和 delete 有區別嗎?SQLServerdelete
- 新的主鍵和外來鍵的語法
- 【北亞資料恢復】oracle資料庫執行truncate table命令怎麼恢復資料?資料恢復Oracle資料庫
- [20181212]關於truncate reuse storage.txt
- mysql——ROUND與TRUNCATE函式之比較MySql函式
- truncate操作消除ORACLE SEG壞塊解析Oracle
- [20181212]truncate的另類恢復5.txt
- 【DB筆試面試185】在Oracle中,如何讓普通使用者可以TRUNCATE其他使用者的表?筆試面試Oracle
- [20181031]truncate IDL_UB1$恢復.txt
- MySQL truncate慢影響系統qps分析MySql
- [20180630]truncate table的另類恢復2.txt
- oracle資料庫災難挽救應急方案之DDL誤操作恢復(truncate)Oracle資料庫
- 資料庫:外來鍵是什麼資料庫
- vim 回退鍵無法使用
- 使用硬連結和coreutils的truncate工具shrink大檔案方法一例