کلید اصلی (Primary Key) در SQL
Primary Key یک محدودیت (Constraint) است که یک یا چند ستون در جدول را یکتا (Unique) و بدون مقدار خالی (Not Null) میکند. کلید اصلی برای شناسایی یکتای هر رکورد در یک جدول استفاده میشود.
مثال از تعریف کلید اصلی
CREATE TABLE Students (
StudentID INT NOT NULL,
FirstName NVARCHAR(50),
LastName NVARCHAR(50),
PRIMARY KEY (StudentID)
);
در مثال بالا، ستون StudentID
به عنوان کلید اصلی در جدول Students
تعریف شده است. این بدان معناست که هر مقدار در ستون StudentID
باید یکتا و غیر تهی باشد.
گاهی اوقات نیاز داریم تا لیستی از تمامی کلیدهای اصلی (Primary Key) موجود در دیتابیسمان را به همراه جداول مربوطه داشته باشیم. برای بدست آوردن این اطلاعات در SQL Server میتوانیم یکی از دستورات زیر را استفاده کنیم.
استفاده از INFORMATION_SCHEMA
دستور زیر با استفاده از جداول INFORMATION_SCHEMA تمامی کلیدهای اصلی موجود در دیتابیس را استخراج میکند:
SELECT
KCU.TABLE_NAME AS Table_Name,
KCU.CONSTRAINT_NAME AS Constraint_Name,
KCU.COLUMN_NAME AS COLUMN_NAME
FROM
INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE KCU
ON KCU.CONSTRAINT_SCHEMA = TC.CONSTRAINT_SCHEMA
AND KCU.CONSTRAINT_NAME = TC.CONSTRAINT_NAME
AND KCU.TABLE_SCHEMA = TC.TABLE_SCHEMA
AND KCU.TABLE_NAME = TC.TABLE_NAME
WHERE
TC.CONSTRAINT_TYPE = 'PRIMARY KEY'
ORDER BY
KCU.TABLE_SCHEMA, KCU.TABLE_NAME, KCU.CONSTRAINT_NAME;
استفاده از و
اگر ترجیح میدهید از جداول سیستم استفاده کنید، دستور زیر برای یافتن کلید اصلی پیشنهاد خوبی است:
SELECT SCHEMA_NAME(tab.schema_id) AS [Table_schema],
pk.[name] AS PrimaryKey_name,
SUBSTRING(column_names, 1, LEN(column_names)-1) AS [Tables_columns],
tab.[name] AS table_name
FROM sys.tables tab
INNER JOIN sys.indexes pk
ON tab.object_id = pk.object_id
AND pk.is_primary_key = 1
CROSS APPLY (SELECT col.[name] + ','
FROM sys.index_columns ic
INNER JOIN sys.columns col
ON ic.object_id = col.object_id
AND ic.column_id = col.column_id
WHERE ic.object_id = tab.object_id
AND ic.index_id = pk.index_id
ORDER BY col.column_id
FOR XML PATH ('') ) D (column_names)
ORDER BY schema_name(tab.schema_id), pk.[name];
خروجی اسکریپتهای بالا مشابه تصویر زیر خواهد بود:
دستور دیگری برای پیدا کردن کلیدهای اصلی
برای پیدا کردن تمام کلیدهای اصلی در یک دیتابیس، میتوانید به جدول sys.objects
مراجعه کنید و فیلتر بر روی کلیدهای اصلی اعمال کنید. دستور زیر نمونهای است که میتوانید از آن استفاده کنید:
SELECT name
FROM sys.objects
WHERE type = 'U' -- فقط جداول را در نظر بگیرید
AND OBJECTPROPERTY(object_id, 'IsPrimaryKey') = 1;
این دستور تمام جداولی که کلید اصلی دارند را بر اساس نام جدول برمیگرداند و فیلتر را بر روی محدودیتهای اصلی اعمال میکند.
نکته مهم
دسترسی به متادیتا در دیتابیس، در هر سیستم مدیریت پایگاه داده (DBMS) ممکن است متفاوت باشد. مثلاً در Oracle، متادیتا در جداول ALL_CONSTRAINTS
و ALL_CONS_COLUMNS
ذخیره میشود. بنابراین، بسته به نوع DBMS که استفاده میکنید، دستورات و جداول مورد استفاده برای پیدا کردن کلیدهای اصلی ممکن است متفاوت باشد.
سوالات متداول (FAQ)
۱. تفاوت بین Primary Key و Unique Key در SQL چیست؟
Primary Key نمیتواند مقدار NULL داشته باشد و فقط یک بار در هر جدول تعریف میشود. در حالی که Unique Key میتواند چند بار در جدول استفاده شود و مقادیر NULL را میپذیرد.
۲. آیا یک جدول میتواند چند کلید اصلی داشته باشد؟
خیر، هر جدول فقط میتواند یک Primary Key داشته باشد. با این حال، این کلید میتواند ترکیبی از چند ستون (Composite Key) باشد.
۳. اگر بخواهم کلید اصلی را حذف یا تغییر دهم، باید چه کنم؟
برای حذف کلید اصلی از دستور ALTER TABLE <table_name> DROP CONSTRAINT <constraint_name>
استفاده کن. برای تغییر آن، ابتدا باید کلید اصلی فعلی را حذف و سپس کلید جدیدی تعریف کنی.
۴. کدام روش برای استخراج اطلاعات کلیدهای اصلی بهتر است؟ INFORMATION_SCHEMA یا sys objects؟
روش INFORMATION_SCHEMA استانداردتر و مستقل از پیادهسازی SQL Server است، اما sys.objects و sys.indexes اطلاعات دقیقتری در اختیار میگذارند و در سناریوهای پیشرفته مفیدتر هستند.
۵. آیا میتوان کلید اصلی را روی چند ستون تعریف کرد؟
بله، میتوان یک کلید اصلی ترکیبی (Composite Primary Key) ایجاد کرد که چند ستون را به عنوان شناسه یکتا در نظر بگیرد.
پیشنهاد مطالعه:
ارتباط و مشاوره
آیا نیاز به بررسی ساختار کلیدهای اصلی جداول در دیتابیستان دارید؟
تیم ما در شرکت لاندا آماده است تا ساختار دیتابیس شما را بررسی و بهینه کند.
با ما تماس ✆ بگیرید تا از ابزارهای تحلیلی پیشرفته برای استخراج و مستندسازی Primary Keyها در پروژه شما استفاده کنیم.
لاندا، متخصص در معماری پایگاه داده و اجرای پروژههای SQL Server
همین حالا برای مشاوره رایگان تماس ✆ بگیرید و از تجربهی متخصصان SQL Server بهرهمند شوید.
نظری داده نشده