给定pk值,有没有办法找到哪些表与该特定pk有关系?

时间:2015-02-10 18:43:11

标签: oracle

假设我有一个PK列的给定值:

10

是否有查询要查找与该特定pk值有关系的所有表?

3 个答案:

答案 0 :(得分: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;  

答案 1 :(得分:2)

不是单个查询,但您可以编写PL / SQL块来执行此操作。您首先查询USER_CONSTRAINTS(或ALL_CONSTRAINTS或DBA_CONSTRAINTS)以查找具有引用给定主键的外键的表。对于每个,您都要创建并执行动态SQL查询,以查看是否有任何行具有您感兴趣的特定PK值。

使其适用于多列密钥将是一项额外的挑战。

答案 2 :(得分: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