Skip to content

Instantly share code, notes, and snippets.

@PickledDragon
Created October 25, 2015 11:30
Show Gist options
  • Save PickledDragon/dd41f4e72b428175354d to your computer and use it in GitHub Desktop.
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

Nice ;)

@phannam1412
Copy link

good job

@TSMMark
Copy link

TSMMark commented Apr 27, 2018

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

very helpful, thanks!

@wlievens
Copy link

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

@mrezzamoradi
Copy link

very nice, thanks!

@MousaHalaseh
Copy link

very helpful! thanks man

@WalleEve
Copy link

WalleEve commented Aug 6, 2018

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
Copy link

hecklek commented May 15, 2019

Thank you very much for sharing.

@kalistons
Copy link

nice :)

@nwbkhan
Copy link

nwbkhan commented Jan 14, 2020

nice one.

@mYakut
Copy link

mYakut commented Sep 28, 2020

Thanks a lot ^^

@PickledDragon
Copy link
Author

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

@fabian-campos-imprivata

nice

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