📚 فصل ۱۲ — کلید اصلی (Primary Key) و کلید خارجی (Foreign Key) در SQL Server
1️⃣ مقدمه — اهمیت کلیدها در پایگاه داده رابطهای
در یک پایگاه داده رابطهای (Relational Database)، دادهها در جداول ذخیره میشوند و این جداول با استفاده از کلیدها (Keys) به هم مرتبط میشوند.
- کلید اصلی (Primary Key) وظیفه دارد هر رکورد را به صورت یکتا شناسایی کند.
- کلید خارجی (Foreign Key) وظیفه دارد ارتباط بین جداول را برقرار کند و یکپارچگی دادهها (Data Integrity) را تضمین کند.
بدون استفاده درست از این کلیدها:
- دادهها ممکن است تکراری ذخیره شوند.
- روابط بین جداول گم میشوند.
- احتمال از بین رفتن انسجام و اعتبار دادهها زیاد میشود.
📌 به زبان ساده:
- Primary Key شبیه شماره ملی هر فرد است (یگانه و غیرقابل تکرار).
- Foreign Key شبیه کد پستی روی بستههای پستی که آن را به یک آدرس مشخص وصل میکند.
2️⃣ تعریف کلید اصلی (Primary Key)
2.1 ویژگیهای Primary Key
- مقدار یکتا — دو رکورد نمیتوانند یک مقدار Primary Key یکسان داشته باشند.
- غیر Null بودن — هیچ رکوردی نمیتواند مقدار
NULL
در ستون Primary Key داشته باشد. - فقط یک Primary Key در هر جدول — ولی میتواند شامل چند ستون (Composite) باشد.
- ایجاد شدن خودکار ایندکس (Index) — برای سریعتر شدن جستجو.
2.2 انواع Primary Key
الف) Simple Primary Key
فقط یک ستون بهعنوان کلید اصلی.
CREATE TABLE Customers (
CustomerID INT PRIMARY KEY,
FullName NVARCHAR(100) NOT NULL
);
ب) Composite Primary Key
ترکیب چند ستون به جای یک ستون.
CREATE TABLE StudentCourses (
StudentID INT,
CourseID INT,
PRIMARY KEY (StudentID, CourseID)
);
2.3 ایجاد Primary Key در SQL Server Management Studio (SSMS)
- روی پایگاه داده → پوشه Tables → راست کلیک → New Table…
- ستونها را اضافه کن.
- روی ستون موردنظر راست کلیک → Set Primary Key.
- فایل را ذخیره کن.
2.4 ایجاد Primary Key با T-SQL
CREATE TABLE Products (
ProductID INT PRIMARY KEY,
ProductName NVARCHAR(200)
);
یا اضافه کردن Primary Key به جدول موجود:
ALTER TABLE Products
ADD CONSTRAINT PK_Products PRIMARY KEY (ProductID);
3️⃣ تعریف کلید خارجی (Foreign Key)
3.1 وظیفه Foreign Key
- برقرار کردن ارتباط بین دو جدول.
- اطمینان از اینکه مقدار موجود در ستون Foreign Key، در جدول مرجع (Referenced Table) وجود دارد.
3.2 مثال ساده
CREATE TABLE Orders (
OrderID INT PRIMARY KEY,
CustomerID INT FOREIGN KEY REFERENCES Customers(CustomerID)
);
اینجا:
- جدول
Customers
مرجع است. - جدول
Orders
دارای Foreign Key برای ستونCustomerID
است.
3.3 قوانین یکپارچگی ارجاعی (Referential Integrity)
- نمیتوان رکوردی اضافه کرد که مقدار Foreign Key آن در جدول مرجع وجود نداشته باشد.
- اگر رکورد مرجع حذف شود:
- یا باید رکوردهای وابسته هم حذف شوند (
CASCADE
)، - یا باید جلوگیری شود (
NO ACTION
).
3.4 ایجاد Foreign Key در SSMS
- در Design جدول، ستون مرتبط را اضافه کن.
- جدول را ذخیره کن.
- در منوی طراحی جدول → Relationships… کلیک کن.
- کلید خارجی را تعریف و جدول مرجع را انتخاب کن.
3.5 ایجاد Foreign Key با T-SQL
CREATE TABLE Orders (
OrderID INT PRIMARY KEY,
CustomerID INT,
CONSTRAINT FK_Orders_Customers FOREIGN KEY (CustomerID)
REFERENCES Customers(CustomerID)
);
4️⃣ تفاوت Primary Key و Foreign Key
ویژگی | Primary Key | Foreign Key |
---|---|---|
منحصر به فرد | بله | خیر |
مقدار NULL مجاز | خیر | بله |
تعداد در جدول | یک | چندتا |
هدف | شناسایی رکورد | ایجاد ارتباط |
5️⃣ رفتارهای Cascade
SQL Server به ما اجازه میدهد مشخص کنیم هنگام حذف یا آپدیت رکورد مرجع، رکوردهای وابسته چه شوند.
5.1 حذف آبشاری (ON DELETE CASCADE)
وقتی رکورد والد پاک شود، رکوردهای فرزند هم خودکار حذف میشوند.
CREATE TABLE Orders (
OrderID INT PRIMARY KEY,
CustomerID INT,
FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID) ON DELETE CASCADE
);
5.2 بهروزرسانی آبشاری (ON UPDATE CASCADE)
وقتی مقدار Primary Key تغییر کند، خودکار در جدول فرزند هم تغییر میکند.
6️⃣ مشکلات رایج در استفاده از Keys
- نداشتن Primary Key → داده تکراری یا نامعتبر.
- Foreign Key بدون ایندکس → کاهش سرعت جستجو.
- استفاده از Composite Key با تعداد ستون زیاد.
- حذف اشتباهی دادهها با
CASCADE
.
7️⃣ بهترین شیوهها
- برای Primary Key از ستون کوچک، عددی و Auto Increment استفاده کن.
- نام Constraintها را معنادار بگذار (
PK_TableName
,FK_Child_Parent
). - کلید خارجی را همیشه ایندکس کن.
- از GUID (
UNIQUEIDENTIFIER
) فقط زمانی استفاده کن که لازم باشد.
8️⃣ تمرین عملی — ساخت دو جدول با ارتباط یکبهچند
CREATE TABLE Customers (
CustomerID INT IDENTITY PRIMARY KEY,
FullName NVARCHAR(100) NOT NULL
);
CREATE TABLE Orders (
OrderID INT IDENTITY PRIMARY KEY,
CustomerID INT,
OrderDate DATETIME DEFAULT GETDATE(),
CONSTRAINT FK_Orders_Customers FOREIGN KEY (CustomerID)
REFERENCES Customers(CustomerID) ON DELETE CASCADE
);
حالا:
INSERT INTO Customers (FullName) VALUES (N'علی محمدی');
INSERT INTO Orders (CustomerID) VALUES (1);
اگر Customers
با ID=1
حذف شود، سفارشاتش هم پاک میشوند.
9️⃣ جمعبندی
- Primary Key برای شناسایی یکتای رکوردهاست.
- Foreign Key برای ارتباط بین جداول و حفظ یکپارچگی دادههاست.
- رفتارهای Cascade مدیریت حذف و بروزرسانی را ساده میکنند.
- رعایت استاندارد در نامگذاری و ایندکسگذاری مهم است.