Programming Basics SQL HTML CSS JavaScript React Python C++ Java JavaFX Swing Problem Solving English English Conversations Computer Fundamentals Linux Learn Typing

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;
-- سيتم حذفها 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 في حال كان يوجد في قاعدة البيانات جدول إسمه 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)
);
-- سيتم حذفه 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, ..)
);
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 في حال كان يوجد في قاعدة البيانات جدول إسمه 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 PRIMARY KEY (column_name);

في حال كنت تنوي تعيين أكثر من عمود واحد كمفتاح رئيسي يجب إضافة قيد لتعيينه كما يلي.

ALTER TABLE table_name
ADD CONSTRAINT pk_constraint_name PRIMARY KEY (column1, column2, ..);
ALTER TABLE table_name ADD CONSTRAINT pk_constraint_name PRIMARY KEY (column1, column2, ..);

الإستعلام التالي يقوم بتعيين العمود id الموجود في الجدول users كمفتاح رئيسي.

المثال الأول

ALTER TABLE users
ADD PRIMARY KEY (id);
ALTER TABLE users ADD PRIMARY KEY (id);

الإستعلام التالي يقوم بتعيين العمودين id و username الموجودين في الجدول users كمفتاح رئيسي.

المثال الثاني

ALTER TABLE users
ADD CONSTRAINT pk_users PRIMARY KEY (id, username);
ALTER TABLE users ADD CONSTRAINT pk_users PRIMARY KEY (id, username);

حذف المفتاح الرئيسي

لحذف المفتاح الرئيسي الذي قمت بإضافته سابقاً كقيد في الجدول يمكنك استخدام الأمر ALTER كما يلي.

ALTER TABLE table_name
DROP CONSTRAINT pk_constraint_name;
ALTER TABLE table_name DROP CONSTRAINT pk_constraint_name;
  • مكان الكلمة table_name نضع إسم الجدول الذي يحتوي على القيد.
  • مكان الكلمة constraint_name نضع إسم القيد الذي نريد حذفه.

الإستعلام التالي يقوم بحذف القيد pk_users الذي تم وضعه سابقاً لتعيين المفتاح الرئيسي في الجدول users.

مثال

ALTER TABLE users
DROP CONSTRAINT pk_users;
ALTER TABLE users DROP CONSTRAINT pk_users;

خاص بقواعد بيانات MySQL

في حال تم تعيين العمود الرئيسي بواسطة الخاصية PRIMARY KEY فإنه يمكن إزالتها منه كما يلي.

ALTER TABLE table_name
DROP 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;
ALTER TABLE users CHANGE COLUMN id id INT NOT NULL, DROP PRIMARY KEY;