2010-09-16 68 views
3

有沒有我能做的查詢來查找哪些表在給定的表上有外鍵?我們的DBA不相信(或理解?)「ON DELETE CASCADE」,所以當我從表中刪除某些東西時,我想確保先刪除所有相關的東西。如何查找哪些表在我的表上有外鍵?

(注意,我並不需要以編程方式查找表,我能做到這一點在SQL * Plus)。

+0

這是一個很好的DBA! – 2010-09-16 14:28:03

+1

聽起來更「不相信」。 ON DELETE CASCADE與查看約束條件和刪除引用記錄相同。 – Christian13467 2010-09-16 14:28:11

+0

但是,ON DELETE CASCADE的速度非常慢,如果這是一項大型工作,通常最好先刪除所有的孩子。 – 2010-09-16 15:59:56

回答

2
SELECT dc.constraint_name, dc.constraint_type, dc.owner, dc.table_name 
FROM dba_cons_columns dcc 
JOIN dba_constraints dc ON (dcc.constraint_name = dc.r_constraint_name and dc.owner = dcc.owner) 
WHERE dcc.owner = 'OWNER_NAME' and dcc.table_name = 'TABLE_NAME'; 
+0

我必須將第二行更改爲'FROM dba_cons_columns dcc JOIN dba_constraints dc ON(dcc.constraint_name = dc.r_constraint_name和dc.owner = dcc.owner)',因爲多個所有者具有相同的約束名稱。 – 2010-09-16 15:14:05

+0

好的。我已經更新了我的答案。謝謝。 – 2010-09-16 15:16:47

1

檢查all_constraintsall_cons_columns字典。

+0

我在這些字典中看不到列中的外鍵,因此,如果我從all_constraints中選擇where table_name ='CLIENT',並且它顯示了'CLIENT'上的所有索引和約束,但是我找不到一個查詢,顯示哪些表在CLIENT上有一個外鍵。 – 2010-09-16 14:39:26

+0

哦,但是如果我從all_constraints中選擇*其中r_constraint_name ='PK__CLIENT',它就是我想要的。大多。 – 2010-09-16 14:43:25

相關問題