مفهوم المفتاح الرئيسي ( Primary Key )
المفتاح الرئيسي هو العمود الذي نضعه في الجدول بهدف جعلنا قادرين على الوصول إلى كل سطر فيه بسهولة سواء بهدف الحصول على قيمه, تعديلها أو لحذف السطر كما هو من الجدول. بالإضافة إلى ذلك, فأننا نستخدمه لربط قيم الجداول ببعضها البعض و هذه الأمور سبق و شرحناها بتفصيل ممل.
كمثال بسيط, في الجدول التالي يمكننا الوصول لأي سطر من خلال رقم id
السطر.
id | first_name | last_name |
1 | Ahmad | Eid |
2 | Ramez | Morad |
3 | Hassan | Mortada |
4 | Saad | Alkassem |
5 | Zaher | Fahmi |
معلومة تقنية
العمود الذي يتم تعيينه كمفتاح رئيسي لا يسمح بأن يتم تخزين قيم مكررة فيه.
بمعنى آخر, جميع قيم المفتاح الرئيسي تعتبر موحدة ( UNIQUE
) حتى و إن لم نعرفها كذلك.
تعيين المفتاح الرئيسي
في أغلب الأوقات, تحتاج وضع عمود واحد في الجدول ليكون بمثابة المفتاح الرئيسي للوصول لكل سطر فيه و هذا الأمر تطرقنا له كثيراً في الدروس السابقة حيث كنا نضع عمود واحد إسمه id
كمفتاح رئيسي في أي جدول ننشئه, و لكن في بعض الحالات قد تجد أنك بحاجة إلى تكوين مفتاح رئيسي في الجدول من عامودين أو أكثر و ليس من عمود واحد فقط.
تعيين العمود كمفتاح رئيسي عند إنشاء الجدول
إذا كنت تنوي تعيين عمود كمفتاح رئيسي في الجدول, يمكنك إضافة الخاصية PRIMARY KEY
إلى تعريف العمود فقط.
عندها سيصبح العمود لا يقبل أن تخزن فيه قيم مكررة و سيجبرك على إدخال قيم بنفسك له.
المثال الأول
في المثال التالي, عند إنشاء جدول جديد قمنا بإنشاء عمود نوعه INT
و تعيينه كمفتاح رئيسي في الجدول.
الإستعلام
CREATE TABLE users (
id INT PRIMARY KEY, -- users كمفتاح رئيسي للجدول id هنا قمنا بتعريف العامود
first_name VARCHAR(50),
last_name VARCHAR(50)
);
المثال الثاني
في المثال التالي, عند إنشاء جدول جديد قمنا بإنشاء عمود نوعه VARCHAR
و تعيينه كمفتاح رئيسي في الجدول.
الإستعلام
CREATE TABLE users (
username VARCHAR(50) PRIMARY KEY, -- users كمفتاح رئيسي للجدول username هنا قمنا بتعريف العامود
first_name VARCHAR(50),
last_name VARCHAR(50)
);
تعيين أكثر من عمود كمفتاح رئيسي عند إنشاء الجدول
لتعيين أكثر من عمود كمفتاح رئيسي في الجدول, يجب إضافة قيد ( CONSTRAINT
) على الجدول نحدد فيه كل الأعمدة التي نريدها أن تكون بمثابة مفتاح رئيسي.
إنتبه لنقطة مهمة جداً, و هي أنه عند تعيين عامودين كمفتاح رئيسي, فإن كل عمود منهم يعتبر عمود عادي جداً و لكنهما مع بعض يشكلان مفتاح واحد.
الشكل العام لإضافة قيد خاص بتعيين المفتاح الرئيسي
لإضافة CONSTRAINT
خاص بتحديد الأعمدة التي نريد تعيينها بمثابة PRIMARY KEY
واحد يجب كتابتة الإستعلام كالتالي.
CREATE TABLE table_name (
column1 datatype NOT NULL,
column2 datatype NOT NULL,
...,
CONSTRAINT PK_table_name PRIMARY KEY (column1, column2)
);
مثال
في المثال التالي, عند إنشاء جدول جديد قمنا بإنشاء عمود نوعه INT
و عمود نوعه VARCHAR
و تعيينهما كمفتاح رئيسي في الجدول.
لتعيين هذين العمودين كمفتاح واحد فعلنا التالي:
- العمود
id
قمنا بتعريفه INT NOT NULL
لأننا نريد إدخال قيمة رقمية و أن لا يسمح بترك الحقل فارغاً.
- العمود
username
قمنا بتعريفه VARCHAR(50) NOT NULL
لأننا نريد إدخال قيم نصية لا يتعدى طولها 50 حرف و أن لا يسمح بترك الحقل فارغاً.
- قمنا بإضافة
CONSTRAINT
نوعه PRIMARY KEY
بإسم pk_users
ليكون مشابهاً لإسم الجدول فقط.
- ذكرنا فيه إسم العمودين اللذين نريد وضعهما كمفتاح رئيسي في الجدول بين أقواس القيد
PRIMARY KEY
.
الإستعلام
CREATE TABLE users (
id INT NOT NULL,
username VARCHAR(50) NOT NULL,
first_name VARCHAR(50),
last_name VARCHAR(50),
CONSTRAINT pk_users PRIMARY KEY (id, username)
);
الآن, لاحظ أن العمود username
يمكنه أن يحتوي على قيم مكررة و العمود id
كذلك أيضاً.
السببب الذي يجعل ذلك لا يشكل مشكلة هو أن كل عمود منهما لا يشكل مفتاح رئيسي لوحده, بل قيمتهما مع بعضهما هي ما تشكل المفتاح الرئيسي في كل سطر.
id | username | first_name | last_name |
1 | ahmad | Ahmad | Eid |
2 | ahmad | Ahmad | Rashad |
2 | hassan | Hassan | Mortada |
3 | saad | Saad | Alkassem |
1ahmad
هو مفتاح السطر الأول.
2ahmad
هو مفتاح السطر الثاني.
2hassan
هو مفتاح السطر الثالث.
3saad
هو مفتاح السطر الرابع.
إذاً في حال كان المفتاح الرئيسي يتألف من أكثر من عامود, يمكننا جعل الأعمدة تقبل أن يكون فيها قيم مكررة و لكن لا يمكننا تكرار نفس قيم الأعمدة الموجودة على نفس السطر في سطر آخر.
في الجدول السابق ممنوع تكرار نفس الـ id و الـ username في أكثر من سطر. أي ممنوع إدخال قيم مكررة كالتالي.
id | username | first_name | last_name |
1 | ahmad | Ahmad | Eid |
1 | ahmad | Ahmad | Rashad |
تعيين المفتاح الرئيسي بعد إنشاء الجدول
إذا كنت تنوي تعيين المفتاح الرئيسي بعد إنشاء الجدول, يجب أن تتأكد أولاً أن العمود أو الأعمدة التي تنوي وضعها كمفتاح رئيسي لا تحتوي على حقول فارغة.
في حال كنت تنوي تعيين عمود واحد كمفتاح رئيسي, يمكنك استخدام الأمر ALTER
لتعيينه كالتالي.
ALTER TABLE table_name
ADD PRIMARY KEY (column_name);
في حال كنت تنوي تعيين أكثر من عمود واحد كمفتاح رئيسي, يجب إضافة CONSTRAINT
لتعيينه كالتالي.
ALTER TABLE table_name
ADD CONSTRAINT pk_constraint_name PRIMARY KEY (column1, column2, ..);
المثال الأول
الإستعلام التالي يقوم بتعيين العمود id
الموجود في الجدول users
كمفتاح رئيسي.
الإستعلام
ALTER TABLE users
ADD PRIMARY KEY (id);
المثال الثاني
الإستعلام التالي يقوم بتعيين العمودين id
و username
الموجودين في الجدول users
كمفتاح رئيسي.
الإستعلام
ALTER TABLE users
ADD CONSTRAINT pk_users PRIMARY KEY (id, username);
حذف المفتاح الرئيسي
في حال أردت إلغاء المفتاح الرئيسي الذي قمت بتعيينه سابقاً. يمكنك تعديل العمود بواسطة الأمر ALTER
مع الإشارة إلى أن طريقة فعل ذلك تختلف من قاعدة بيانات لأخرى.
في قواعد بيانات MySQL
ALTER TABLE table_name
DROP PRIMARY KEY;
الإستعلام التالي يقوم بإلغاء تعيين المفتاح الرئيسي الموضوع في الجدول users
.
هنا لا داعي لذكر إسم المفتاح الرئيسي الذي تنوي إلغاؤه.
مثال
ALTER TABLE users
DROP PRIMARY KEY;
في قواعد بيانات SQL Server / Oracle / Access
ALTER TABLE table_name
DROP CONSTRAINT pk_constraint_name;
الإستعلام التالي يقوم بحذف القيد pk_users
الذي تم وضعه سابقاً لتعيين المفتاح الرئيسي في الجدول users
.
هنا يجب ذكر إسم القيد الذي يمثل المفتاح الرئيسي الذي تنوي إلغاؤه.
مثال
ALTER TABLE users
DROP CONSTRAINT pk_users;