有沒有我能做的查詢來查找哪些表在給定的表上有外鍵?我們的DBA不相信(或理解?)「ON DELETE CASCADE」,所以當我從表中刪除某些東西時,我想確保先刪除所有相關的東西。如何查找哪些表在我的表上有外鍵?
(注意,我並不需要以編程方式查找表,我能做到這一點在SQL * Plus)。
有沒有我能做的查詢來查找哪些表在給定的表上有外鍵?我們的DBA不相信(或理解?)「ON DELETE CASCADE」,所以當我從表中刪除某些東西時,我想確保先刪除所有相關的東西。如何查找哪些表在我的表上有外鍵?
(注意,我並不需要以編程方式查找表,我能做到這一點在SQL * Plus)。
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';
我必須將第二行更改爲'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
好的。我已經更新了我的答案。謝謝。 – 2010-09-16 15:16:47
檢查all_constraints
和all_cons_columns
字典。
我在這些字典中看不到列中的外鍵,因此,如果我從all_constraints中選擇where table_name ='CLIENT',並且它顯示了'CLIENT'上的所有索引和約束,但是我找不到一個查詢,顯示哪些表在CLIENT上有一個外鍵。 – 2010-09-16 14:39:26
哦,但是如果我從all_constraints中選擇*其中r_constraint_name ='PK__CLIENT',它就是我想要的。大多。 – 2010-09-16 14:43:25
這是一個很好的DBA! – 2010-09-16 14:28:03
聽起來更「不相信」。 ON DELETE CASCADE與查看約束條件和刪除引用記錄相同。 – Christian13467 2010-09-16 14:28:11
但是,ON DELETE CASCADE的速度非常慢,如果這是一項大型工作,通常最好先刪除所有的孩子。 – 2010-09-16 15:59:56