چگونه کلیدهای خارجی (foreign keys) مرتبط با جدول را بیابیم؟
ضمن عرض سلام و خسته نباشید خدمت همکاران گرامی،
اگر تا کنون هنگام حذف یک جدول (drop table) با اخطاری شبیه اخطار زیر مواجه شده اید:
Cannot drop the table ‘TableName’ because it is referenced by a FOREIGN KEY constraint ‘FK_ConstraintName’.
این آموزش دقیقا مناسب شماست.
همانطور که میدانید دو جدول می توانند از طریق کلیدهای خارجی با هم در ارتباط باشند.
SQL Server اجازه نمیدهد جدولی را که هدف یک foreign key در جدول دیگری است حذف کنید، مگر اینکه یکی از اقدامات زیر صورت گیرد:
- ابتدا Foreign Key مربوطه را حذف کنید.
- یا جدول referencing را حذف کنید.
- یا FK را بهصورت موقت غیرفعال کنید (که خیلی توصیه نمیشود).
حال برای اینکه از بهترین روش (گزینه 1) بخواهید استفاده کنید، می توانید از کد زیر استفاده کنید تا روابط برای شما نمایش داده شوند:
SELECT
fk.name AS ForeignKeyName,
tp.name AS ReferencingTable,
cp.name AS ReferencingColumn,
tr.name AS ThisTable,
cr.name AS ThisColumn
FROM sys.foreign_keys AS fk
INNER JOIN sys.foreign_key_columns AS fkc ON fk.object_id = fkc.constraint_object_id
INNER JOIN sys.tables AS tp ON fkc.parent_object_id = tp.object_id
INNER JOIN sys.columns AS cp ON fkc.parent_object_id = cp.object_id AND fkc.parent_column_id = cp.column_id
INNER JOIN sys.tables AS tr ON fkc.referenced_object_id = tr.object_id
INNER JOIN sys.columns AS cr ON fkc.referenced_object_id = cr.object_id AND fkc.referenced_column_id = cr.column_id
WHERE tr.name = ‘اسم جدول مورد نظر’
ORDER BY fk.name;
با استفاده از این کد، ابتدا میتوانید جداول وابسته را پیدا کنید و سپس برای حذف رکورد یا جدول، کلیدهای خارجی آنها را مدیریت نمایید. (در صورتی که حذف یک رکورد خاص مدنظر است، شرط WHERE مربوطه را برای همان رکورد اعمال کنید.)
در ضمن میتوانید از قطعه کد زیر برای یافتن روابطی که جدول شما به جداول دیگر دارد استفاده نمایید. (کلیدهای خارجی که از این جدول بیرون میروند.):
SELECT
fk.name AS ForeignKeyName,
tp.name AS ThisTable,
cp.name AS ThisColumn,
tr.name AS ReferencedTable,
cr.name AS ReferencedColumn
FROM sys.foreign_keys AS fk
INNER JOIN sys.foreign_key_columns AS fkc ON fk.object_id = fkc.constraint_object_id
INNER JOIN sys.tables AS tp ON fkc.parent_object_id = tp.object_id
INNER JOIN sys.columns AS cp ON fkc.parent_object_id = cp.object_id AND fkc.parent_column_id = cp.column_id
INNER JOIN sys.tables AS tr ON fkc.referenced_object_id = tr.object_id
INNER JOIN sys.columns AS cr ON fkc.referenced_object_id = cr.object_id AND fkc.referenced_column_id = cr.column_id
WHERE tp.name = ‘اسم جدول مورد نظر’
ORDER BY fk.name;
ارسال نظر