【问题标题】:Oracle all foreign key referencesOracle 所有外键引用
【发布时间】:2009-07-23 12:18:05
【问题描述】:

我继承了一个架构,因此对其中的内容没有完整的知识/信心。

我有一个带有 projectId 的项目表。还有一大堆其他表通过项目 ID 引用此表。我想要做的是运行一个查询来建立:

  1. 哪些表具有对项目表的外键引用 项目编号
  2. 哪些表有一个名为 project id 的列(在 未设置大小写外键)。

如果是 SQL Server,我知道如何查询元数据,但如何在 Oracle 中执行此操作?

【问题讨论】:

    标签: oracle


    【解决方案1】:

    1)

    select table_name
      from all_constraints
     where r_constraint_name = [your pk/uk constraint on PROJECTS(id)]
    

    2)

    select table_name
      from all_tab_columns
     where column_name = 'PROJECT_ID'
    

    您可能想要添加一个包含 OWNER 列的额外谓词。

    问候, 抢。

    【讨论】:

      【解决方案2】:

      好的。这是一个为您提供引用的表和列的请求:

      SELECT
       c_list.CONSTRAINT_NAME as NAME,
       substr(c_src.COLUMN_NAME, 1, 20) as SRC_COLUMN,
       c_dest.TABLE_NAME as DEST_TABLE,
       substr(c_dest.COLUMN_NAME, 1, 20) as DEST_COLUMN
      FROM ALL_CONSTRAINTS c_list, ALL_CONS_COLUMNS c_src, ALL_CONS_COLUMNS c_dest
      WHERE c_list.CONSTRAINT_NAME   = c_src.CONSTRAINT_NAME
       AND  c_list.OWNER             = c_src.OWNER
       AND  c_list.R_CONSTRAINT_NAME = c_dest.CONSTRAINT_NAME
       AND  c_list.OWNER             = c_dest.OWNER
       AND  c_list.CONSTRAINT_TYPE = 'R'
       AND  c_src.OWNER      = '<your-schema-here>'
       AND  c_src.TABLE_NAME = '<your-table-here>'
      GROUP BY c_list.CONSTRAINT_NAME, c_src.TABLE_NAME,
          c_src.COLUMN_NAME, c_dest.TABLE_NAME, c_dest.COLUMN_NAME;
      

      这会给你这样的东西:

      NAME                  |SRC_COLUMN      |DEST_TABLE            | DEST_COLUMN
      ----------------------|----------------|----------------------|-----------
      CFK_RUB_FOR           |FOR_URN         |T03_FORMAT            |FOR_URN
      CFK_RUB_RUB           |RUB_RUB_URN     |T01_RUBRIQUE          |RUB_URN
      CFK_RUB_SUP           |SUP_URN         |T01_SUPPORT           |SUP_URN
      CFK_RUB_PRD           |PRD_URN         |T05_PRODUIT           |PRD_URN
      

      如果没有结果可用,您可以忘记 substr() 函数。这不是我的情况。

      【讨论】:

        【解决方案3】:

        1):SELECT * FROM USER_CONSTRAINTS WHERE CONSTRAINT_NAME='R' and R_CONSTRAINT_NAME='xxx'

        其中 xxx 是项目表上的主键约束的名称

        2):SELECT * FROM USER_TAB_COLUMNS WHERE COLUMN_NAME='PROJECT_ID'

        【讨论】:

        • 外键约束可能会跨模式,所以我不会选择 user_constraints。 user_tab_columns 的同上。
        • Rob:这真的取决于。在我的环境中, user_... 就足够了, all_tab_columns 会给出误导性的结果。
        • ammoQ:是的,这取决于。 user_... 可能就足够了。但是请参阅线程的标题:“所有外键引用” ...
        【解决方案4】:

        这里的r_constraint_name 答案似乎对我不起作用,不知道为什么我自己是 Oracle 的新手,但这有效:

        SELECT * FROM ALL_CONSTRAINTS WHERE CONSTRAINT_NAME = '<constraint>';
        

        【讨论】:

          【解决方案5】:

          我的问题略有不同。我有一个表,我想以编程方式知道它引用了哪些其他表/列。

          我从上面 Stan 的回复开始,但这并没有完全满足我的需要,所以我想出了这个,我在这里发布,以防其他人有我的问题:

          WITH src as
          (SELECT ac.table_name, ac.constraint_name, accs.column_name, accs.position, ac.r_constraint_name
            FROM ALL_CONSTRAINTS ac, all_cons_columns accs
           WHERE ac.owner = '<owner>'
             AND ac.constraint_type = 'R'
             AND ac.table_name = '<src_table>'
             AND accs.owner = ac.owner
             AND accs.table_name = ac.table_name
             AND accs.constraint_name = ac.constraint_name
          ORDER BY ac.table_name, ac.constraint_name, accs.position),
          dst as
          (SELECT ac.table_name, ac.constraint_name, accs.column_name, accs.position
            FROM ALL_CONSTRAINTS ac, all_cons_columns accs
           WHERE ac.owner = '<owner>'
             AND accs.owner = ac.owner
             AND accs.table_name = ac.table_name
             AND accs.constraint_name = ac.constraint_name
          ORDER BY ac.table_name, ac.constraint_name, accs.position)
          SELECT src.table_name as src_table,
                 dst.table_name as dst_table,
                 src.constraint_name as src_constraint,
                 src.column_name as src_column,
                 dst.column_name as dst_column,
                 src.position as position
            FROM src,dst
           WHERE src.r_constraint_name = dst.constraint_name
             AND src.position = dst.position
          

          【讨论】:

            【解决方案6】:

            使用此查询。

               select b.TABLE_NAME,b.CONSTRAINT_NAME ,a.COLUMN_NAME
               from all_constraints b, all_cons_columns a
               where r_constraint_name = 'Constraint_Name' and  a.CONSTRAINT_NAME=b.CONSTRAINT_NAME;
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-04-19
              • 2011-02-27
              • 1970-01-01
              • 1970-01-01
              • 2018-12-21
              • 1970-01-01
              • 2017-02-17
              • 2011-05-21
              相关资源
              最近更新 更多