首页 > 解决方案 > 用于选择数据库中所有 pk/fk 的 SQL 查询

问题描述

我尝试搜索一个查询,该查询给出一个大数据库的所有 pk 和 fk。由于我找不到任何好的查询,我想出了一个解决方案。

SELECT 
    cols.table_name, cols.column_name, cols.position, cons.status, cons.owner
FROM 
    all_constraints cons, all_cons_columns cols
WHERE 
    cols.owner = 'DATABASE_NAME'
    AND cons.constraint_type = 'P'
    AND cons.constraint_name = cols.constraint_name
    AND cons.owner = cols.owner
ORDER BY 
    cols.table_name, cols.position;

唯一需要更改的是将“DATABASE_NAME”更改为特定的数据库名称!

我的问题是,是否有一种“更简单”的方法可以从一个大数据库中获取所有主键?

标签: sqloracleprimary-key

解决方案


查询的另一个版本可用于获取与表的外键关系,如下所示:

SELECT constr.table_name,
    column_name,
    position,
    constr.constraint_name,
    DECODE (constraint_type, 'P', 'Primary Key', 'Foreign Key') key_type,
       (SELECT constr2.table_name
        FROM all_constraints constr2
        WHERE constr2.CONSTRAINT_NAME = constr.R_CONSTRAINT_NAME) fK_to_table
    FROM all_cons_columns conscol, all_constraints constr
   WHERE     conscol.constraint_name = constr.constraint_name
         AND conscol.table_name = constr.table_name
         AND CONSTRAINT_TYPE IN ('P', 'R')
         --AND constr.table_name = 'MYTEBLE' (your table here)
ORDER BY table_name, constraint_type, position;

输出将采用以下格式

TABLE_NAME  COLUMN_NAME     POSITION   CONSTRAINT_NAME  KEY_TYPE     FK_TO_TABLE
ACCOUNT     ACCOUNT_ID          1        ACCOUNT_PK     Primary Key     
ACCOUNT     ACCOUNT_TYPE_ID     1        ACCOUNT_FK3    Foreign Key  ACCOUNT_TYPE

推荐阅读