T-SQL Tutorial

How to check if foreign key constraint exists


Determining whether a foreign key constraint exists in SQL Server using T-SQL is crucial for ensuring database integrity and avoiding data inconsistencies. In SQL Server, you can check if a foreign key constraint exists by querying the system catalog views or using the INFORMATION_SCHEMA views. The following T-SQL examples demonstrate two different approaches to achieve this:


1. Querying the system catalog views (sys.objects and sys.foreign_keys)

You can use the sys.objects and sys.foreign_keys catalog views to check if a foreign key constraint exists for a specific table in your database. Here's how you can do it:

-- Check if a foreign key constraint exists for a specific table
DECLARE @TableName NVARCHAR(255) = 'YourTableName'
DECLARE @ForeignKeyName NVARCHAR(255) = 'YourForeignKeyName'

IF EXISTS (
SELECT 1
FROM sys.objects o
INNER JOIN sys.foreign_keys fk ON o.object_id = fk.parent_object_id
WHERE o.type = 'F' -- F indicates a foreign key constraint
AND o.name = @ForeignKeyName
AND fk.referenced_object_id = OBJECT_ID(@TableName)
)
BEGIN
PRINT 'Foreign key constraint exists for ' + @TableName
END
ELSE
BEGIN
PRINT 'Foreign key constraint does not exist for ' + @TableName
END

Replace 'YourTableName' and 'YourForeignKeyName' with the actual table and foreign key constraint names you want to check.


2. Using the INFORMATION_SCHEMA views

You can also use the INFORMATION_SCHEMA views, which provide a more standardized way to access schema-related information. Here's how to check if a foreign key constraint exists using INFORMATION_SCHEMA:

-- Check if a foreign key constraint exists for a specific table
DECLARE @TableName NVARCHAR(255) = 'YourTableName'
DECLARE @ForeignKeyName NVARCHAR(255) = 'YourForeignKeyName'

IF EXISTS (
SELECT 1
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
ON rc.CONSTRAINT_NAME = tc.CONSTRAINT_NAME
WHERE tc.TABLE_NAME = @TableName
AND rc.CONSTRAINT_NAME = @ForeignKeyName
)
BEGIN
PRINT 'Foreign key constraint exists for ' + @TableName
END
ELSE
BEGIN
PRINT 'Foreign key constraint does not exist for ' + @TableName
END

Again, replace 'YourTableName' and 'YourForeignKeyName' with the actual table and foreign key constraint names you want to check.


3. Using a Try-Catch block

You can also use a TRY-CATCH block to attempt to create the foreign key constraint and handle the error if it already exists. Here's an example:

BEGIN TRY
ALTER TABLE YourTableName
ADD CONSTRAINT YourForeignKeyConstraintName
FOREIGN KEY (YourForeignKeyColumn)
REFERENCES ReferencedTableName (ReferencedColumn);
-- If the constraint doesn't exist, this will create it.
END TRY
BEGIN CATCH
-- Handle the error here if the constraint already exists.
PRINT 'The foreign key constraint already exists.';
END CATCH;






4. Using SP_FKEYS stored procedure

To check if a foreign key constraint exists on a table uses the system stored procedure named SP_FKEYS .

USE tempdb;
GO
EXEC sp_fkeys
@pktable_name = 'DEPARTMENTS',
@pktable_owner = 'dbo';

USE tempdb;
GO
EXEC sp_fkeys
@pktable_name = 'DEPARTMENTS',
@pktable_owner = 'dbo',
@pktable_qualifier = 'tempdb',
@fktable_name = 'EMPLOYEES',
@fktable_owner = 'dbo',
@fktable_qualifier = 'tempdb';
GO