给定一个pk值,有没有一种方法可以找到哪些表与该特定pk有关系



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

10

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

单列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;  

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

使其适用于多列键将是一个额外的挑战。

以下是它在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

最新更新