Microsoft SQL Server: How to Find the Foreign Keys in a Database

Contributor Icon Contributed by shamanstears Date Icon October 4, 2008  
Tag Icon Tagged: Database

A foreign key is a column or columns that are used to enforce a link between data in two tables. While SQL Server gives you no quick and easy way to view all foreign keys in a database, this quick query will give you that information. It comes in handy when trying to troubleshoot Foreign Key Constraint errors.

1. Open a New Query on the desired database.

2. Copy, paste, and execute the following:
SELECT
FKConstraintName = a.CONSTRAINT_NAME,
FKTable = b.TABLE_NAME,
FKColumn = c.COLUMN_NAME,
PKTable = d.TABLE_NAME,
PKColumn = e.COLUMN_NAME
 
FROM
INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS a
INNER JOIN
INFORMATION_SCHEMA.TABLE_CONSTRAINTS b
ON a.CONSTRAINT_NAME = b.CONSTRAINT_NAME
INNER JOIN
INFORMATION_SCHEMA.TABLE_CONSTRAINTS d
ON a.UNIQUE_CONSTRAINT_NAME = d.CONSTRAINT_NAME
INNER JOIN
INFORMATION_SCHEMA.KEY_COLUMN_USAGE c
ON a.CONSTRAINT_NAME = c.CONSTRAINT_NAME
INNER JOIN
(
SELECT
f.TABLE_NAME, g.COLUMN_NAME
 
FROM
INFORMATION_SCHEMA.TABLE_CONSTRAINTS f
INNER JOIN
INFORMATION_SCHEMA.KEY_COLUMN_USAGE g
ON f.CONSTRAINT_NAME = g.CONSTRAINT_NAME
WHERE f.CONSTRAINT_TYPE = 'PRIMARY KEY'
) e
 
ON e.TABLE_NAME = d.TABLE_NAME
 
ORDER BY a.CONSTRAINT_NAME

You can now easily see all foreign keys in that database.

Previous recipe | Next recipe |
 
  • Heiner
    Hi!

    Your sql seems to have problems with foreign keys consisting of several columns. I get for example:

    IE_FK_ADDRESS_USER IE_ADDRESS INST_ID IE_USER HOLDER_ID
    IE_FK_ADDRESS_USER IE_ADDRESS INST_ID IE_USER INST_ID
    IE_FK_ADDRESS_USER IE_ADDRESS USER_HOLDER_ID IE_USER HOLDER_ID
    IE_FK_ADDRESS_USER IE_ADDRESS USER_HOLDER_ID IE_USER INST_ID

    but just the second and third row are okay. I am far from being an sql expert, but the following select returns the correct result for my database:

    SELECT
    ConstraintName = a.CONSTRAINT_NAME,
    FromTable = c.TABLE_NAME,
    FromColumn = c.COLUMN_NAME,
    ToTable = d.TABLE_NAME,
    ToColumn = d.COLUMN_NAME
    FROM
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS a,
    INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS b,
    INFORMATION_SCHEMA.KEY_COLUMN_USAGE c,
    INFORMATION_SCHEMA.KEY_COLUMN_USAGE d
    WHERE a.CONSTRAINT_TYPE = 'FOREIGN KEY'
    and a.CONSTRAINT_NAME = b.CONSTRAINT_NAME
    and a.CONSTRAINT_NAME = c.CONSTRAINT_NAME
    and b.UNIQUE_CONSTRAINT_NAME = d.CONSTRAINT_NAME
    and c.ORDINAL_POSITION = d.ORDINAL_POSITION
    ORDER BY a.CONSTRAINT_NAME, c.ORDINAL_POSITION

    Best regards,


    Heiner
blog comments powered by Disqus