کلید اصلی-Primary Key-دیتابیس-SQL Server-INFORMATION_SCHEMA-sys.objects-متادیتا-Constraint

کلید اصلی (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];

خروجی اسکریپت‌های بالا مشابه تصویر زیر خواهد بود:

کلید اصلی-Primary Key-Constraint-Composite Key

دستور دیگری برای پیدا کردن کلیدهای اصلی

برای پیدا کردن تمام کلیدهای اصلی در یک دیتابیس، می‌توانید به جدول 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 بهره‌مند شوید.

نظری داده نشده

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *