oracle查詢某張表的外鍵,並用 truncate 命令有外鍵的表中的數據

注:本文來源於《oracle查詢某張表的外鍵(最終解決辦法)html


一:幾個查詢表外鍵的腳本


select b.table_name, b.column_name from user_constraints a
inner join user_cons_columns b on a.constraint_name = b.constraint_name
 where a.r_constraint_name in
  (
   select e.constraint_name from user_constraints e  where e.table_name = 'GK_ZWVCH'
  )


Oracle 查看一個表對應的主鍵和外鍵的約束關係,查看的語句:


 select a.owner, --主鍵擁有者  

        a.table_name, --主鍵表  

        b.column_name, --主鍵列  

        c.OWNER, --外鍵擁有者  

        c.table_name, --外鍵表  

        d.column_name --外鍵列  

 from user_constraints  a

 left join user_cons_columns b

             on  a.constraint_name=b.constraint_name

 left join user_constraints c

             on c.R_CONSTRAINT_NAME=a.constraint_name

 left join user_cons_columns d

             on c.constraint_name=d.constraint_name

 where  a.constraint_type='P'

     and  a.table_name='GK_ZWVCH' --須要查看主外鍵關係的表  

 order by a.table_name


二:truncate  有外鍵關係的表數據



問題緣由


雖然truncate table在刪除數據的速度上會佔有必定的優點,但並非在全部的狀況咱們均可以使用truncate,存在如下狀況就使用truncate就會失敗。
1,要刪除數據的表包含foreign key約束(被其餘表引用),而delete則能夠經過級聯刪除來刪除相關聯的數據。
2,被索引視圖引用過的表,也不能使用truncate。oracle

解決方案


有外鍵的表只能用delete,不能用truncate,這是語法規定,要麼就取消外鍵再truncate。
能夠先禁用外鍵約束,刪除完畢後,再啓動外鍵約束。spa

查找外鍵關聯

SELECT T1.TABLE_NAME,
       T2.TABLE_NAME AS "TABLE_NAME(R)",
       T1.CONSTRAINT_NAME,
       T1.R_CONSTRAINT_NAME AS "CONSTRAINT_NAME(R)",
       A1.COLUMN_NAME,
       A2.COLUMN_NAME AS "COLUMN_NAME(R)"
  FROM USER_CONSTRAINTS T1
 INNER JOIN USER_CONSTRAINTS T2 ON T1.R_CONSTRAINT_NAME =
                                   T2.CONSTRAINT_NAME
 INNER JOIN USER_CONS_COLUMNS A1 ON T1.CONSTRAINT_NAME =
                                    A1.CONSTRAINT_NAME
 INNER JOIN USER_CONS_COLUMNS A2 ON T1.R_CONSTRAINT_NAME =
                                    A2.CONSTRAINT_NAME
 WHERE T2.TABLE_NAME = '要刪的表名';


外鍵禁用/開啓

--禁用約束:
alter table XXX disable constraint XXX;
--啓用約束
alter table XXX enable constraint XXX;


具體實例操做:

相關文章
相關標籤/搜索