PostgreSQL: SQL script to get a list of all tables that has a particular column as foreign key

前端 未结 9 946
独厮守ぢ
独厮守ぢ 2021-01-29 23:31

I\'m using PostgreSQL and I\'m trying to list all the tables that have a particular column from a table as a foreign-key/reference. Can this be done? I\'m sure this information

相关标签:
9条回答
  • 2021-01-30 00:15

    Table constraints can include multiple columns. The trick to getting this right is to join each column by their constraint ordinal positions. If you don't join correctly your script will blow up with duplicate rows

    0 讨论(0)
  • 2021-01-30 00:18
    SELECT
      main_table.table_name            AS main_table_table_name,
      main_table.column_name           AS main_table_column_name,
      main_table.constraint_name       AS main_table_constraint_name,
      info_other_table.table_name      AS info_other_table_table_name,
      info_other_table.constraint_name AS info_other_table_constraint_name,
      info_other_table.column_name     AS info_other_table_column_name
    FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE main_table
      INNER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS other_table
        ON other_table.unique_constraint_name = main_table.constraint_name
      INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE info_other_table
        ON info_other_table.constraint_name = other_table.constraint_name
    WHERE main_table.table_name = 'MAIN_TABLE_NAME';
    
    0 讨论(0)
  • 2021-01-30 00:19

    Personally, I prefer to query based on the referenced unique constraint rather than the column. That would look something like this:

    SELECT rc.constraint_catalog,
           rc.constraint_schema||'.'||tc.table_name AS table_name,
           kcu.column_name,
           match_option,
           update_rule,
           delete_rule
    FROM information_schema.referential_constraints AS rc 
        JOIN information_schema.table_constraints AS tc USING(constraint_catalog,constraint_schema,constraint_name)
        JOIN information_schema.key_column_usage AS kcu USING(constraint_catalog,constraint_schema,constraint_name)
    WHERE unique_constraint_catalog='catalog'
        AND unique_constraint_schema='schema'
        AND unique_constraint_name='constraint name';
    

    Here is a version that allows querying by column name:

    SELECT rc.constraint_catalog,
           rc.constraint_schema||'.'||tc.table_name AS table_name,
           kcu.column_name,
           match_option,
           update_rule,
           delete_rule
    FROM information_schema.referential_constraints AS rc
        JOIN information_schema.table_constraints AS tc USING(constraint_catalog,constraint_schema,constraint_name)
        JOIN information_schema.key_column_usage AS kcu USING(constraint_catalog,constraint_schema,constraint_name)
        JOIN information_schema.key_column_usage AS ccu ON(ccu.constraint_catalog=rc.unique_constraint_catalog AND ccu.constraint_schema=rc.unique_constraint_schema AND ccu.constraint_name=rc.unique_constraint_name)
    WHERE ccu.table_catalog='catalog'
        AND ccu.table_schema='schema'
        AND ccu.table_name='name'
        AND ccu.column_name='column';
    
    0 讨论(0)
提交回复
热议问题