truncate 命令使用

to_be_Dba發表於2013-03-06

今天使用truncate清空表時報錯了:

SQL> truncate table ref_set;

truncate table ref_set

ORA-02266: 表中的唯一/主鍵被啟用的外來鍵引用

通過dba_constraints檢視,該表的主鍵被其他表所引用,因此無法truncate。即使從表中的資料被清空或者從來沒有過資料,也無法直接對被引用的表執行truncate操作。

解決方法:alter table tab_name disable constraint constraint_name;

說明:以前曾經聽過關於truncate的限制,但實際工作中由於用的比較少,漸漸忘了。

除了存在外來鍵約束而無法執行truncate外,還應該注意:truncate是ddl操作,如果在執行truncate過程中由其他使用者的dml操作沒有提交,truncate會觸發其提交操作。因此在併發比較高的系統中慎重使用truncate命令。

 

根據表名查詢有哪些外來鍵呼叫了該表中的列:

select a.table_name "被引用表",a.constraint_name "約束名",
b.constraint_name "外來鍵名",b.table_name "引用表" from dba_constraints a,dba_constraints b
where a.constraint_type='P' and a.owner=:COLUMN_NAME
and a.constraint_name=b.r_constraint_name;

以下直接產生禁用約束的語句:

select 'alter table '||b.table_name||'disable constraint '||b.constraint_name
from dba_constraints a,dba_constraints b
where a.constraint_type='P' and a.owner=:COLUMN_NAME
and a.constraint_name=b.r_constraint_name and a.table_name=:table_name;

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

相關文章