Skip to content

Instantly share code, notes, and snippets.

@PickledDragon
Created October 25, 2015 11:30
Show Gist options
  • Select an option

  • Save PickledDragon/dd41f4e72b428175354d to your computer and use it in GitHub Desktop.

Select an option

Save PickledDragon/dd41f4e72b428175354d to your computer and use it in GitHub Desktop.
Postgres list all constraints
SELECT
tc.constraint_name, tc.table_name, kcu.column_name,
ccu.table_name AS foreign_table_name,
ccu.column_name AS foreign_column_name
FROM
information_schema.table_constraints AS tc
JOIN information_schema.key_column_usage AS kcu
ON tc.constraint_name = kcu.constraint_name
JOIN information_schema.constraint_column_usage AS ccu
ON ccu.constraint_name = tc.constraint_name
WHERE constraint_type = 'FOREIGN KEY'
@filiponegrao

Copy link
Copy Markdown

Nice ;)

@phannam1412

Copy link
Copy Markdown

good job

@TSMMark

TSMMark commented Apr 27, 2018

Copy link
Copy Markdown

I ported this to ruby gem Sequel DSL if anyone is interested Note: I removed the WHERE constraint_type = 'FOREIGN KEY' clause, but it would be easy to add it in

def very_slow_constraint_lookup_for_table(table_name)
  DB[Sequel.as(:information_schema__table_constraints, :tc)].
    join(Sequel.as(:information_schema__key_column_usage, :kcu),
      :tc__constraint_name => :kcu__constraint_name
    ).
    join(Sequel.as(:information_schema__constraint_column_usage, :ccu),
      :tc__constraint_name => :ccu__constraint_name
    ).
    where(:tc__table_name => table_name.to_s).
    all
end

very_slow_constraint_lookup_for_table("my_table")

Example results:

[{:constraint_catalog=>"vydia",
  :constraint_schema=>"public",
  :constraint_name=>"asdfg",
  :table_catalog=>"vydia",
  :table_schema=>"public",
  :table_name=>"my_table",
  :constraint_type=>"FOREIGN KEY",
  :is_deferrable=>"NO",
  :initially_deferred=>"NO",
  :column_name=>"id",
  :ordinal_position=>1,
  :position_in_unique_constraint=>1},
{:constraint_catalog=>"vydia",
  :constraint_schema=>"public",
  :constraint_name=>"asdfg",
  :table_catalog=>"vydia",
  :table_schema=>"public",
  :table_name=>"my_table",
  :constraint_type=>"PRIMARY KEY",
  :is_deferrable=>"NO",
  :initially_deferred=>"NO",
  :column_name=>"id",
  :ordinal_position=>1,
  :position_in_unique_constraint=>nil}]

@dwaltrip

Copy link
Copy Markdown

very helpful, thanks!

@wlievens

Copy link
Copy Markdown

Very helpful! I used it to base this off: https://gist.github.com/wlievens/e875e489a398f856dc96a8b8dc88ec2c

@mrezzamoradi

Copy link
Copy Markdown

very nice, thanks!

@MousaHalaseh

Copy link
Copy Markdown

very helpful! thanks man

@WalleEve

WalleEve commented Aug 6, 2018

Copy link
Copy Markdown

hi,
thnx for sharing the code,

In postgreSQL we can have same constraint name in different schema with the same table name or different. In that case we are getting some incorrect records.
by adding constraint schema name as qualifier we can avoid duplicate
tc.constraint_schema = kcu.constraint_schema ,
ccu.constraint_schema = tc.constraint_schema

@hecklek

hecklek commented May 15, 2019

Copy link
Copy Markdown

Thank you very much for sharing.

@kalistons

Copy link
Copy Markdown

nice :)

@nwbkhan

nwbkhan commented Jan 14, 2020

Copy link
Copy Markdown

nice one.

@mYakut

mYakut commented Sep 28, 2020

Copy link
Copy Markdown

Thanks a lot ^^

@PickledDragon

Copy link
Copy Markdown
Author

Holy crap! Was this gist so popular? I didn't realize 😆

@fabian-campos-imprivata

Copy link
Copy Markdown

nice

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment