【问题标题】:Oracle get foreign keysoracle获取外键
【发布时间】:2023-03-21 21:35:02
【问题描述】:

我想获取架构中的所有外键,就像这样。 假设我有桌子

users(id, username, pass, address_id)

addresses(id, text)

我在 users-address_id 上为地址中的 id 列定义了一个 FK。 我应该如何编写一个返回 FK 列的查询,例如: 用户,address_id,地址,id?

谢谢!

SELECT *
FROM all_cons_columns a
JOIN all_constraints c ON a.owner = c.owner
    AND a.constraint_name = c.constraint_name
JOIN all_constraints c_pk ON c.r_owner = c_pk.owner
    AND c.r_constraint_name = c_pk.constraint_name
WHERE  C.R_OWNER = 'TRWBI'

【问题讨论】:

    标签: sql oracle foreign-keys


    【解决方案1】:

    找到了!

    这就是我要找的东西,谢谢大家的帮助。

    SELECT a.table_name, a.column_name, uc.table_name, uc.column_name 
                    FROM all_cons_columns a
                    JOIN all_constraints c ON a.owner = c.owner
                        AND a.constraint_name = c.constraint_name
                    JOIN all_constraints c_pk ON c.r_owner = c_pk.owner
                           AND c.r_constraint_name = c_pk.constraint_name
                    join USER_CONS_COLUMNS uc on uc.constraint_name = c.r_constraint_name
                    WHERE  C.R_OWNER = 'myschema'
    

    【讨论】:

    • 关于,我添加了一些改进版的答案。
    【解决方案2】:

    使用@maephisto 解决方案会遇到一个小错误:
    如果source tables primary key is a composite key 则运行查询将得到duplicate unnecessary records

    考虑 T1 和 T2 表:
    主表 T1:

    create table T1
    (
      pk1 NUMBER not null,
      pk2 NUMBER not null
    );
    alter table T1
      add constraint T1PK primary key (PK1, PK2);
    

    明细表T2:

    create table T2
    (
      pk1   NUMBER,
      pk2   NUMBER,
      name1 VARCHAR2(100)
    );
    alter table T2
      add constraint T2FK foreign key (PK1, PK2)
      references T1 (PK1, PK2);
    

    @maephisto 查询的结果将是:



    为了解决下面的查询将解决的问题:

    SELECT master_table.TABLE_NAME  MASTER_TABLE_NAME,
           master_table.column_name MASTER_KEY_COLUMN,
           detail_table.TABLE_NAME  DETAIL_TABLE_NAME,
           detail_table.column_name DETAIL_COLUMN
      FROM user_constraints  constraint_info,
           user_cons_columns detail_table,
           user_cons_columns master_table
     WHERE constraint_info.constraint_name = detail_table.constraint_name
       AND constraint_info.r_constraint_name = master_table.constraint_name
       AND detail_table.POSITION = master_table.POSITION
       AND constraint_info.constraint_type = 'R'
       AND constraint_info.OWNER = 'MY_SCHEMA'
    


    【讨论】:

      【解决方案3】:

      【讨论】:

      • 谢谢!但从那里我无法得到引用的列,只是引用的约束......
      • 谢谢,但我仍然没有得到想要的输出。我将编辑并发布我的查询
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-23
      • 2019-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多