SQL تعيين العمود كمفتاح رئيسي
- مفهوم المفتاح الرئيسي
- تجهيز قاعدة البيانات التي سنطبق عليها
- تعيين العمود كمفتاح رئيسي عند إنشاء الجدول
- تعيين أكثر من عمود كمفتاح رئيسي عند إنشاء الجدول
- تعيين المفتاح الرئيسي بعد إنشاء الجدول
- حذف المفتاح الرئيسي
مفهوم المفتاح الرئيسي
المفتاح الرئيسي ( 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
كمفتاح رئيسي في أي جدول ننشئه و لكن في بعض الحالات قد تجد أنك بحاجة إلى تكوين مفتاح رئيسي في الجدول من عمودين أو أكثر و ليس من عمود واحد فقط.
تجهيز قاعدة البيانات التي سنطبق عليها
قم بتنفيذ الإستعلام التالي حتى تنشئ قاعدة بيانات جديدة إسمها harmash
.
مثال
-- سيتم حذفها harmash في حال كان يوجد بالأساس قاعدة بيانات إسمها DROP DATABASE IF EXISTS harmash; -- harmash هنا قمنا بإنشاء قاعدة بيانات جديدة إسمها CREATE DATABASE harmash; -- harmash هنا قمنا بتحديد أن أي إستعلام جديد سيتم تنفيذه على قاعدة البيانات USE harmash;
تعيين العمود كمفتاح رئيسي عند إنشاء الجدول
إذا كنت تنوي تعيين عمود كمفتاح رئيسي في الجدول، يمكنك إضافة الخاصية PRIMARY KEY
إلى تعريف العمود فقط.
عندها سيصبح العمود لا يقبل أن تخزن فيه قيم مكررة و سيجبرك على إدخال قيم بنفسك له.
الإستعلام التالي ينشئ جدول جديد إسمه users
فيه 3 أعمدة مع تعيين عمود نوعه INT
كمفتاح رئيسي فيه.
المثال الأول
-- سيتم حذفه users في حال كان يوجد في قاعدة البيانات جدول إسمه DROP TABLE IF EXISTS users; -- users هنا قمنا بإنشاء جدول جديد إسمه CREATE TABLE users ( id INT PRIMARY KEY, -- users كمفتاح رئيسي للجدول id هنا قمنا بتعريف العامود first_name VARCHAR(50), last_name VARCHAR(50) );
الإستعلام التالي ينشئ جدول جديد إسمه users
فيه 3 أعمدة مع تعيين عمود نوعه VARCHAR
كمفتاح رئيسي فيه.
المثال الثاني
-- سيتم حذفه users في حال كان يوجد في قاعدة البيانات جدول إسمه DROP TABLE IF EXISTS users; -- users هنا قمنا بإنشاء جدول جديد إسمه CREATE TABLE users ( username VARCHAR(50) PRIMARY KEY, -- users كمفتاح رئيسي للجدول username هنا قمنا بتعريف العامود first_name VARCHAR(50), last_name VARCHAR(50) );
تعيين أكثر من عمود كمفتاح رئيسي عند إنشاء الجدول
لتعيين أكثر من عمود كمفتاح رئيسي في الجدول يجب إضافة قيد ( Constraint ) للجدول نحدد فيه كل الأعمدة التي نريدها أن تكون بمثابة مفتاح رئيسي فيه.
عند تعيين عمودين كمفتاح رئيسي، فإن كل عمود منهم يعتبر عمود عادي و لكنهما مع بعض يشكلان مفتاح واحد.
طريقة إضافة قيد لتعيين المفتاح الرئيسي
لإضافة قيد خاص بتحديد الأعمدة التي نريد تعيينها بمثابة PRIMARY KEY
واحد يجب كتابتة الإستعلام كما يلي.
CREATE TABLE table_name ( column1 datatype NOT NULL, column2 datatype NOT NULL, ..., CONSTRAINT pk_table_name PRIMARY KEY (column1, column2, ..) );
- مكان الكلمة
pk_table_name
نضع الإسم الذي سيتم إعطاؤه للمفتاح. - مكان الكلمة
column1
وcolumn2
نضع إسم العمود أو الأعمدة التي ستمثل المفتاح.
الإستعلام التالي ينشئ جدول جديد إسمه users
وضعنا فيه مفتاح رئيسي يتكون من عمودين كما يلي:
- العمود الأول إسمه
id
و نوعهINT
لأننا نريد وضع قيم عددية فيه. - العمود الثاني إسمه
username
و نوعهVARCHAR
لأننا نريد وضع قيم نصية فيه.
لتعيين هذين العمودين كمفتاح واحد قمنا بإضافة قيد نوعه PRIMARY KEY
بإسم pk_users
ليكون مشابهاً لإسم الجدول فقط. و بين أقواسه وضعنا إسم العمودين اللذين نريد وضعهما كمفتاح رئيسي في الجدول.
مثال
-- سيتم حذفه users في حال كان يوجد في قاعدة البيانات جدول إسمه DROP TABLE IF EXISTS users; -- users هنا قمنا بإنشاء جدول جديد إسمه 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) );
كيفية التعامل مع الجدول users
لاحظ أن العمودين id
و username
يمكن أن يحتويا على قيم مكررة كما يلي.
id | username | first_name | last_name |
---|---|---|---|
1 | ahmad | Ahmad | Eid |
2 | ahmad | Ahmad | Rashad |
2 | hassan | Hassan | Mortada |
3 | saad | Saad | Alkassem |
سبب قدرتنا على وضع قيم مكررة في العمودين id
و username
هو أن كل عمود منهما لا يشكل مفتاح رئيسي بحد ذاته، بل قيمتهما مع بعضهما هي ما تشكل المفتاح الرئيسي في كل سطر على النحو التالي:
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);
في حال كنت تنوي تعيين أكثر من عمود واحد كمفتاح رئيسي يجب إضافة قيد لتعيينه كما يلي.
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
كما يلي.
ALTER TABLE table_name DROP CONSTRAINT pk_constraint_name;
- مكان الكلمة
table_name
نضع إسم الجدول الذي يحتوي على القيد. - مكان الكلمة
constraint_name
نضع إسم القيد الذي نريد حذفه.
الإستعلام التالي يقوم بحذف القيد pk_users
الذي تم وضعه سابقاً لتعيين المفتاح الرئيسي في الجدول users
.
مثال
ALTER TABLE users DROP CONSTRAINT pk_users;
خاص بقواعد بيانات MySQL
في حال تم تعيين العمود الرئيسي بواسطة الخاصية PRIMARY KEY
فإنه يمكن إزالتها منه كما يلي.
ALTER TABLE table_name DROP PRIMARY KEY;
مكان الكلمة table_name
نضع إسم الجدول و خادم قاعدة البيانات سيقوم بشكل تلقائي بإزالة الخاصية PRIMARY KEY
من العمود يملكها.
في حال كان العمود الرئيسي يستعمل تعداد تلقائي - أي يستخدم الخاصية AUTO_INCREMENT
- فإنه يجب إزالة هذه الخاصية منه أيضاً لأنه مسموح استعمالها فقط مع العمود الرئيسي.
الإستعلام التالي يقوم بإلغاء تعيين المفتاح الرئيسي الموضوع في الجدول users
بالإضافة إلى أنه يقوم بإلغاء خاصية التعداد التلقائي منه.
مثال
ALTER TABLE users CHANGE COLUMN id id INT NOT NULL, DROP PRIMARY KEY;