2015-02-10 27 views

回答

2

沒有一個查詢,但你可以寫一個PL/SQL塊來做到這一點。您首先在USER_CONSTRAINTS(或ALL_CONSTRAINTS或DBA_CONSTRAINTS)上查詢,以查找引用給定主鍵的外鍵表。對於每種情況,您都會創建並執行一個動態SQL查詢,以查看是否有任何具有您感興趣的特定PK值的行。

使其適用於多列鍵將是一個額外的挑戰。

0

下面是它看起來如何在SQL Server:

DECLARE @keyColumn VARCHAR(100) 
DECLARE @keyValue INT 
SET @keyColumn = 'SiteID' 
SET @keyValue = 400 
SELECT 'SELECT ''' + TABLE_NAME + ''' AS TABLENAME, "' + @keyColumn 
     + '" FROM "' + TABLE_NAME + '" WHERE "' + @keyColumn + '" = ' 
     + CONVERT(VARCHAR(100), @keyValue) + ' UNION ALL' 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU 
WHERE KCU.COLUMN_NAME = @keyColumn 

我知道Oracle有INFORMATION_SCHEMA,這樣類似的事情應該工作。 我試着用SQLFiddle來適應它,但失敗了。也許這裏的其他人可以編輯我的答案,以便與Oracle合作。

這裏生成的SQL的樣子,在部分:

SELECT 'StockInventory' AS TABLENAME, "SiteID" FROM "StockInventory" WHERE "SiteID" = 400 UNION ALL 
SELECT 'SiteDomains' AS TABLENAME, "SiteID" FROM "SiteDomains" WHERE "SiteID" = 400 UNION ALL 
3

舉例單列PK。 PK約束名稱可以從DBA_CONSTRAINTS(USER_CONSTRAINTS,ALL_CONTRAINTS)派生。 該代碼可以擴展爲多列PK使用集合PK值

declare 
    p_pk_name varchar2(30):= '<PK constraint_name>'; 
    p_pk_value varchar2(500):='<PK value>'; 
    l_cnt int; 
begin 
    for x in 
    (
    select t.owner, t.table_name, cc.column_name 
    from dba_constraints c, 
     dba_tables t, 
     dba_cons_columns cc 
    where c.r_constraint_name = p_pk_name 
     and t.owner = c.owner 
     and t.table_name = c.table_name 
     and cc.owner = c.owner 
     and cc.constraint_name = c.constraint_name 
) 
    loop 
    execute immediate 'select count(1) from '||x.owner||'.'||x.table_name|| ' where '||x.column_name||' = :p_pk_value and rownum <= 1' into l_cnt using p_pk_value ; 
    if l_cnt <> 0 then 
     dbms_output.put_line(x.owner||'.'||x.table_name); 
    end if; 
    end loop; 
end; 
相關問題