مقدمة
من أهم ميزات قواعد البيانات العلائقية تنسيق البيانات بهيكلية محددة بدقة. يتحقق هذا الهيكل باستخدام جداول ذات أعمدة ثابتة، والالتزام بأنواع بيانات محددة بدقة، وضمان تنسيق جميع الصفوف بنفس الطريقة. عند تخزين البيانات كصفوف في جداول، من المهم بنفس القدر إمكانية العثور عليها والإشارة إليها بوضوح. في لغة الاستعلام الهيكلية (SQL)، يمكن تحقيق ذلك باستخدام المفاتيح الأساسية، والتي تعمل كمعرفات للصفوف الفردية في جداول قاعدة البيانات العلائقية.
في هذا البرنامج التعليمي، ستتعلم عن المفاتيح الأساسية واستخدام أنواع مختلفة لتحديد الصفوف الفريدة في جداول قواعد البيانات. باستخدام بعض مجموعات البيانات النموذجية، ستنشئ مفاتيح أساسية على أعمدة مفردة، وأعمدة متعددة، ومفاتيح متسلسلة متزايدة تلقائيًا.
المتطلبات الأساسية
لمتابعة هذا الدليل، ستحتاج إلى جهاز كمبيوتر يعمل بنظام إدارة قواعد بيانات علائقية (RDBMS) قائم على SQL. تم التحقق من صحة التعليمات والأمثلة الواردة في هذا الدليل باستخدام البيئة التالية:
- خادم يعمل بنظام التشغيل Ubuntu 20.04، مع مستخدم غير جذر يتمتع بامتيازات إدارية وجدار حماية مُهيأ باستخدام UFW
- تم تثبيت MySQL وتأمينه على الخادم.
- مقدمة أساسية حول تنفيذ استعلامات SELECT لاسترداد البيانات من قاعدة البيانات
ملاحظة: يُرجى العلم أن العديد من أنظمة إدارة قواعد البيانات العلائقية تستخدم تطبيقها الخاص للغة SQL. مع أن الأوامر المذكورة في هذا البرنامج التعليمي تعمل على معظم أنظمة إدارة قواعد البيانات العلائقية، وأن المفاتيح الأساسية جزء من معيار SQL، إلا أن بعض الميزات خاصة بقاعدة البيانات، وبالتالي قد يختلف بناء الجملة أو الناتج الدقيق إذا اختبرت هذه الميزات على نظام آخر غير MySQL.
ستحتاج أيضًا إلى قاعدة بيانات فارغة لإنشاء الجداول باستخدام المفاتيح الأساسية. ننصحك بمتابعة قسم "الاتصال بـ MySQL وإعداد قاعدة بيانات نموذجية" أدناه للحصول على تفاصيل حول الاتصال بخادم MySQL وإنشاء قاعدة البيانات التجريبية المستخدمة في الأمثلة الواردة في هذا الدليل.
الاتصال بـ MySQL وإعداد قاعدة بيانات نموذجية
في هذا القسم، سوف تتصل بخادم MySQL وتقوم بإنشاء مثيل لقاعدة البيانات حتى تتمكن من استخدام الأمثلة المذكورة في هذا الدليل.
إذا كان نظام قاعدة بيانات SQL الخاص بك يعمل على خادم بعيد، فقم بتسجيل الدخول إلى الخادم الخاص بك عبر SSH من جهازك المحلي:
ssh sammy@your_server_ipثم افتح موجه خادم MySQL واستبدل Sami باسم المستخدم الخاص بك في MySQL:
mysql -u sammy -p
إنشاء قاعدة بيانات تسمى primary_keys:
CREATE DATABASE primary_keys;
إذا تم إنشاء قاعدة البيانات بنجاح، فسوف تتلقى الإخراج التالي:
Output
Query OK, 1 row affected (0.01 sec)لتحديد قاعدة بيانات المفاتيح الأساسية، قم بتشغيل العبارة USE التالية:
USE primary_keys;
سوف تحصل على النتيجة التالية:
Output
Database changedبعد اختيار قاعدة بيانات، يمكنك إنشاء جداول نموذجية فيها. أنت الآن جاهز لمتابعة بقية الدليل وبدء العمل بالمفاتيح الأساسية في MySQL.
مقدمة عن المفاتيح الرئيسية
تُخزَّن البيانات في قواعد البيانات العلائقية في جداول ذات بنية محددة وموحدة للصفوف الفردية. يصف تعريف الجدول الأعمدة وأنواع البيانات التي يمكن تخزينها في كل عمود. هذا وحده كافٍ لتخزين المعلومات في قاعدة البيانات والعثور عليها باستخدام معايير تصفية مختلفة باستخدام شرط WHERE. مع ذلك، لا يضمن هذا الهيكل إمكانية العثور على كل صف بدقة.
تخيل قاعدة بيانات لجميع المركبات المسجلة المسموح لها بالسير على الطرق العامة. تحتوي قاعدة البيانات على معلومات مثل الماركة، والطراز، وسنة الصنع، ولون الطلاء. ومع ذلك، إذا كنت تبحث عن سيارة شيفروليه كامارو حمراء، صُنعت عام ٢٠٠٧، فقد تجد أكثر من واحدة. ففي النهاية، يبيع مصنعو السيارات نفس السيارات لعملاء متعددين. ولهذا السبب، تحمل السيارات المسجلة لوحات أرقام تُعرّف كل مركبة. إذا بحثت عن سيارة تحمل لوحة أرقام OFP857، فتأكد من أن هذا المعيار سيُظهر سيارة واحدة فقط. وذلك لأن لوحات الأرقام، بموجب القانون، تُعرّف السيارات المسجلة بشكل فريد. في قواعد البيانات العلائقية، يُطلق على هذه البيانات اسم المفتاح الأساسي.
المفاتيح الأساسية هي مُعرِّفات فريدة موجودة في عمود أو مجموعة أعمدة، تُحدِّد بوضوح كل صف في جدول قاعدة البيانات. تعكس عدة قواعد الخصائص التقنية للمفاتيح الأساسية:
- يجب أن يستخدم المفتاح الأساسي قيمًا فريدة. إذا كان المفتاح الأساسي يتكون من أكثر من عمود واحد، فيجب أن تكون مجموعة القيم في هذه الأعمدة فريدة في الجدول بأكمله. بما أن المفتاح يُستخدم لتعريف كل صف بشكل فريد، فلا يمكن ظهوره أكثر من مرة.
- لا ينبغي للمفتاح الأساسي أن يحتوي على قيم NULL.
- يمكن لكل جدول قاعدة بيانات استخدام مفتاح أساسي واحد فقط.
ينفذ محرك قاعدة البيانات هذه القواعد، لذا إذا تم تعريف مفتاح أساسي في جدول، فيمكنك الوثوق في صحة هذه السمات.
بالإضافة إلى هذه الميزات التقنية، ينبغي أيضًا مراعاة محتوى البيانات لتحديد نوع البيانات الأنسب كمفتاح أساسي. المفاتيح الطبيعية هي مُعرِّفات موجودة بالفعل في مجموعة البيانات، بينما المفاتيح البديلة هي مُعرِّفات اصطناعية.
تحتوي بعض هياكل البيانات على مفاتيح أساسية تظهر بشكل طبيعي في مجموعة البيانات، مثل أرقام لوحات السيارات في قاعدة بيانات المركبات أو أرقام الضمان الاجتماعي في سجل المواطنين الأمريكيين. أحيانًا، لا تكون هذه المعرفات قيمة واحدة، بل زوجًا أو مزيجًا من عدة قيم. على سبيل المثال، في دليل منازل مدينة محلية، لا يكفي اسم الشارع أو رقمه وحده لتحديد منزل بشكل فريد. قد توجد عدة منازل في شارع واحد، وقد يظهر الرقم نفسه في عدة شوارع. ولكن يمكن اعتبار زوج من أسماء الشوارع وأرقامها معرّفًا فريدًا للمنزل. تُسمى هذه المعرفات الطبيعية بالمفاتيح الطبيعية.
ومع ذلك، غالبًا ما يتعذر تحديد البيانات بشكل فريد من خلال قيم عمود واحد أو مجموعة فرعية صغيرة من الأعمدة. لذا، تُنشأ مفاتيح أساسية اصطناعية، على سبيل المثال، باستخدام سلسلة من الأرقام أو مُعرّفات مُولّدة عشوائيًا مثل مُعرّفات UUID. تُسمى هذه المفاتيح بالمفاتيح البديلة.
في الأقسام التالية، سوف تقوم بإنشاء مفاتيح طبيعية استنادًا إلى عمود واحد أو أكثر وإنشاء مفاتيح بديلة في الجداول حيث لا يكون المفتاح الطبيعي خيارًا.
إنشاء مفتاح أساسي على عمود
في كثير من الحالات، تتضمن مجموعة البيانات عمودًا يُستخدم لتحديد الصفوف في الجدول بشكل فريد. في هذه الحالات، يمكنك إنشاء مفتاح طبيعي لوصف البيانات. بناءً على المثال السابق لقاعدة بيانات السيارات المسجلة، تخيّل جدولًا بالهيكل التالي:
Sample table
+---------------+-----------+------------+-------+------+
| license_plate | brand | model | color | year |
+---------------+-----------+------------+-------+------+
| ABC123 | Ford | Mustang | Red | 2018 |
| CES214 | Ford | Mustang | Red | 2018 |
| DEF456 | Chevrolet | Camaro | Blue | 2016 |
| GHI789 | Dodge | Challenger | Black | 2014 |
+---------------+-----------+------------+-------+------+يصف الصفان الأول والثاني سيارة فورد موستانج حمراء موديل 2018. لا يمكنك تحديد السيارة بشكل فريد باستخدام الماركة والموديل. تختلف لوحة الترخيص في كلا الحالتين، وتوفر مُعرّفًا فريدًا لكل صف في الجدول. بما أن رقم لوحة الترخيص مُضمن في البيانات، فإن استخدامه كمفتاح أساسي يُنشئ مفتاحًا طبيعيًا. إذا أنشأت الجدول دون استخدام مفتاح أساسي في عمود "لوحة الترخيص"، فقد تظهر صفحة مكررة أو فارغة في مجموعة البيانات في وقت ما.
بعد ذلك، قم بإنشاء جدول مشابه للجدول أعلاه مع عمود License_plate كمفتاح أساسي والأعمدة التالية:
- License_plate: يحتوي هذا العمود على رقم لوحة الترخيص، والذي يتم تمثيله بواسطة نوع البيانات varchar.
- العلامة التجارية: يمثل هذا العمود العلامة التجارية للسيارة، معبرًا عنها باستخدام نوع البيانات varchar بحد أقصى 50 حرفًا.
- النموذج: يحتوي هذا العمود على طراز السيارة، معبرًا عنه باستخدام نوع البيانات varchar بحد أقصى 50 حرفًا.
- اللون: يحتوي هذا العمود على اللون، المعبر عنه باستخدام نوع البيانات varchar بحد أقصى 20 حرفًا.
- السنة: يوضح هذا العمود سنة تصنيع السيارة، معبرًا عنها باستخدام نوع البيانات int لتخزين البيانات الرقمية.
لإنشاء جدول الأجهزة، قم بتشغيل العبارة SQL التالية:
CREATE TABLE cars (
license_plate varchar(8) PRIMARY KEY,
brand varchar(50),
model varchar(50),
color varchar(20),
year int
);... */تتبع عبارة المفتاح الأساسي تعريف نوع بيانات لوحة الترخيص. عند التعامل مع المفاتيح الأساسية المستندة إلى أعمدة مفردة، يمكنك استخدام الصيغة المُبسّطة لإنشاء المفتاح وكتابته في تعريف العمود.
إذا تمت طباعة الإخراج التالي، فقد تم إنشاء الجدول:
Output
Query OK, 0 rows affected (0.00 sec)بعد ذلك، قم بتحميل الجدول باستخدام الصفوف النموذجية المقدمة في المثال أعلاه عن طريق تنفيذ عملية INSERT INTO التالية:
INSERT INTO cars VALUES
('ABC123', 'Ford', 'Mustang', 'Red', 2018),
('CES214', 'Ford', 'Mustang', 'Red', 2018),
('DEF456', 'Chevrolet', 'Camaro', 'Blue', 2016),
('GHI789', 'Dodge', 'Challenger', 'Black', 2014);ستستجيب قاعدة البيانات برسالة نجاح:
Output
Query OK, 4 rows affected (0.010 sec)
Records: 4 Duplicates: 0 Warnings: 0يمكنك الآن التحقق من أن الجدول الذي تم إنشاؤه حديثًا يحتوي على البيانات والتنسيق المتوقعين باستخدام عبارة SELECT:
SELECT * FROM cars;
يُظهر الإخراج جدولًا مشابهًا للجدول الموجود في بداية القسم:
Output
+---------------+-----------+------------+-------+------+
| license_plate | brand | model | color | year |
+---------------+-----------+------------+-------+------+
| ABC123 | Ford | Mustang | Red | 2018 |
| CES214 | Ford | Mustang | Red | 2018 |
| DEF456 | Chevrolet | Camaro | Blue | 2016 |
| GHI789 | Dodge | Challenger | Black | 2014 |
+---------------+-----------+------------+-------+------+بعد ذلك، يمكنك التحقق من ضمان قواعد المفتاح الأساسي بواسطة محرك قاعدة البيانات. جرّب إدخال سيارة برقم لوحة ترخيص مكرر بتنفيذ الأمر التالي:
INSERT INTO cars VALUES ('DEF456', 'Jeep', 'Wrangler', 'Yellow', 2019);
يستجيب MySQL برسالة خطأ تقول أن علامة DEF456 تؤدي إلى إدخال مكرر للمفتاح الأساسي:
Output ERROR 1062 (23000): Duplicate entry 'DEF456' for key 'cars.PRIMARY'
ملاحظة: في الأساس، تُنفَّذ المفاتيح الأساسية بفهرسات فريدة، وتشترك في العديد من الخصائص نفسها التي تُنشئها الفهارس يدويًا لأعمدة أخرى في الجدول. والأهم من ذلك، تُحسِّن فهارس المفاتيح الأساسية أيضًا أداء استعلام الجدول عن العمود الذي عُرِّف فيه الفهرس. لمزيد من المعلومات حول استخدام الفهارس لهذا الغرض، راجع دليل "كيفية استخدام الفهارس" في هذا البرنامج التعليمي.
الآن تأكد من عدم السماح بنسخ لوحات الترخيص. بعد ذلك، تحقق من إمكانية استيراد سيارة بلوحة ترخيص فارغة:
INSERT INTO cars VALUES (NULL, 'Jeep', 'Wrangler', 'Yellow', 2019);
هذه المرة ستستجيب قاعدة البيانات برسالة خطأ أخرى:
Output
ERROR 1048 (23000): Column 'license_plate' cannot be nullبفضل هاتين القاعدتين المُطبّقتين بواسطة قاعدة البيانات، يمكنك التأكد من أن License_plate يُعرّف كل صف في الجدول بشكل فريد. إذا استفسرت من الجدول عن كل لوحة ترخيص، فستحصل على صف واحد في كل مرة.
في القسم التالي، سوف تتعلم كيفية استخدام المفاتيح الأساسية مع أعمدة متعددة.
إنشاء مفتاح أساسي عبر أعمدة متعددة
عندما لا يكون عمود واحد كافياً لتحديد صف فريد في جدول، يمكنك إنشاء مفاتيح أساسية تستخدم أكثر من عمود.
على سبيل المثال، تخيل وجود سجل منازل حيث لا يكفي اسم الشارع أو رقم الشارع وحدهما لتحديد هوية كل منزل:
Sample table
+-------------------+---------------+-------------------+------+
| street_name | street_number | house_owner | year |
+-------------------+---------------+-------------------+------+
| 5th Avenue | 100 | Bob Johnson | 2018 |
| Broadway | 1500 | Jane Smith | 2016 |
| Central Park West | 100 | John Doe | 2014 |
| Central Park West | 200 | Tom Thompson | 2015 |
| Lexington Avenue | 5001 | Samantha Davis | 2010 |
| Park Avenue | 7000 | Michael Rodriguez | 2012 |
+-------------------+---------------+-------------------+------+يظهر اسم شارع سنترال بارك ويست أكثر من مرة في الجدول، وكذلك رقم الشارع 100. مع ذلك، لا يمكن رؤية أي أزواج مكررة من اسم الشارع ورقم الشارع. في هذه الحالة، مع أنه لا يمكن لأيٍّ من العمودين أن يكون المفتاح الأساسي، يمكن استخدام زوج هاتين القيمتين لتعريف كل صف في الجدول بشكل فريد.
بعد ذلك، قم بإنشاء جدول مشابه للجدول الموضح أعلاه بالأعمدة التالية:
- street_name: يمثل هذا العمود اسم الشارع الذي يقع فيه المنزل، مع نوع بيانات varchar يقتصر على 50 حرفًا.
- رقم الشارع: يحتوي هذا العمود على رقم شارع المنزل، مُمثَّلاً بنوع البيانات varchar. يُمكن لهذا العمود تخزين ما يصل إلى 5 أحرف. لا يستخدم نوع البيانات int الرقمي لأن بعض أرقام الشوارع قد تحتوي على أحرف (مثل 200B).
- house_owner: يحتوي هذا العمود على اسم مالك المنزل، والذي يتم تمثيله بنوع البيانات varchar المحدود بـ 50 حرفًا.
- السنة: يمثل هذا العمود العام الذي تم فيه بناء المنزل، ويتم تمثيله بنوع البيانات int لتخزين القيم الرقمية.
هذه المرة، يستخدم المفتاح الأساسي عمودي اسم الشارع ورقم الشارع بدلاً من عمود واحد فقط. للقيام بذلك، شغّل جملة SQL التالية:
CREATE TABLE houses (
street_name varchar(50),
street_number varchar(5),
house_owner varchar(50),
year int,
PRIMARY KEY(street_name, street_number)
);هذه المرة، وخلافًا للمثال السابق، تظهر عبارة المفتاح الأساسي أسفل تعريفات الأعمدة. تُحاط عبارة المفتاح الأساسي بين قوسين باسمي عمودين: اسم الشارع ورقم الشارع. يُنشئ هذا التركيب مفتاحًا أساسيًا في جدول المنازل، والذي يقع في عمودين.
إذا تمت طباعة الإخراج التالي، فقد تم إنشاء الجدول:
Output
Query OK, 0 rows affected (0.00 sec)بعد ذلك، قم بتحميل الجدول باستخدام الصفوف النموذجية المقدمة في المثال السابق عن طريق تنفيذ عملية INSERT INTO التالية:
INSERT INTO houses VALUES
('Central Park West', '100', 'John Doe', 2014),
('Broadway', '1500', 'Jane Smith', 2016),
('5th Avenue', '100', 'Bob Johnson', 2018),
('Lexington Avenue', '5001', 'Samantha Davis', 2010),
('Park Avenue', '7000', 'Michael Rodriguez', 2012),
('Central Park West', '200', 'Tom Thompson', 2015);
ستستجيب قاعدة البيانات برسالة نجاح:
Output
Query OK, 6 rows affected (0.000 sec)
Records: 6 Duplicates: 0 Warnings: 0يمكنك الآن التحقق من أن الجدول الذي تم إنشاؤه حديثًا يحتوي على البيانات والتنسيق المتوقعين باستخدام عبارة SELECT:
SELECT * FROM houses;
يُظهر الإخراج جدولًا مشابهًا للجدول الموجود في بداية القسم:
Output
+-------------------+---------------+-------------------+------+
| street_name | street_number | house_owner | year |
+-------------------+---------------+-------------------+------+
| 5th Avenue | 100 | Bob Johnson | 2018 |
| Broadway | 1500 | Jane Smith | 2016 |
| Central Park West | 100 | John Doe | 2014 |
| Central Park West | 200 | Tom Thompson | 2015 |
| Lexington Avenue | 5001 | Samantha Davis | 2010 |
| Park Avenue | 7000 | Michael Rodriguez | 2012 |
+-------------------+---------------+-------------------+------+
6 rows in set (0.000 sec)الآن، لنتحقق مما إذا كانت قاعدة البيانات تسمح بصفوف تُكرر أسماء وأرقام الشوارع، ولكنها تمنع ظهور العناوين الكاملة المكررة في الجدول. لنبدأ بإضافة منزل آخر في شارع بارك:
INSERT INTO houses VALUES ('Park Avenue', '8000', 'Emily Brown', 2011);
يستجيب MySQL برسالة نجاح لأن العنوان 8000 Park Avenue لم يظهر مسبقًا في الجدول:
Output
Query OK, 1 row affected (0.010 sec)تحدث نتيجة مماثلة عندما تضيف منزلًا في 8000 Main Street وتكرر رقم الشارع:
INSERT INTO houses VALUES ('Main Street', '8000', 'David Jones', 2009);
مرة أخرى، يؤدي هذا إلى إدراج صف جديد بشكل صحيح لأن العنوان بأكمله لا يتكرر:
Output
Query OK, 1 row affected (0.010 sec)ومع ذلك، أضف منزلًا آخر في 100 5th Avenue باستخدام بيان INSERT التالي:
INSERT INTO houses VALUES ('5th Avenue', '100', 'Josh Gordon', 2008);
تستجيب قاعدة البيانات برسالة خطأ، لإعلامك بوجود إدخال مكرر للمفتاح الأساسي لزوج القيم 5th Avenue و100:
Output
ERROR 1062 (23000): Duplicate entry '5th Avenue-100' for key 'houses.PRIMARY'تطبق قاعدة البيانات قواعد المفتاح الأساسي بشكل صحيح باستخدام المفتاح المُعرّف في عمودين. يمكنك التأكد من عدم تكرار العنوان الكامل، بما في ذلك اسم الشارع ورقمه، في الجدول.
في هذا القسم، أنشأتَ مفتاحًا طبيعيًا بزوج من الأعمدة لتعريف كل صف في الجدول الرئيسي بشكل فريد. ولكن لا يُمكن دائمًا استخراج المفاتيح الأساسية من مجموعة البيانات. في القسم التالي، ستستخدم مفاتيح أساسية اصطناعية لا تأتي مباشرةً من البيانات.
إنشاء مفتاح أساسي متسلسل
حتى الآن، أنشأتَ مفاتيح أساسية فريدة باستخدام أعمدة من مجموعة البيانات النموذجية. ولكن في بعض الحالات، تُكرر البيانات حتمًا، مما يمنع الأعمدة من أن تكون مُعرّفات فريدة جيدة. في هذه الحالات، يمكنك إنشاء مفاتيح أساسية متسلسلة باستخدام المُعرّفات المُولّدة. عندما تتطلب بياناتك إنشاء مُعرّفات جديدة لتحديد الصفوف، تُسمى المفاتيح الأساسية المُنشأة على هذه المُعرّفات الاصطناعية "مفاتيح بديلة".
تخيّل قائمة بأعضاء نادي الكتاب - تجمع غير رسمي يمكن لأي شخص الانضمام إليه دون إظهار بطاقة هوية حكومية. من المرجح أن ينضم أشخاص يحملون أسماءً مشابهة إلى النادي في وقت ما.
Sample table
+------------+-----------+
| first_name | last_name |
+------------+-----------+
| John | Doe |
| Jane | Smith |
| Bob | Johnson |
| Samantha | Davis |
| Michael | Rodriguez |
| Tom | Thompson |
| Sara | Johnson |
| David | Jones |
| Jane | Smith |
| Bob | Johnson |
+------------+-----------+يتكرر اسما بوب جونسون وجين سميث في الجدول. ستحتاج إلى استخدام مُعرّف إضافي للتأكد من هوية كل عضو، ولا توجد طريقة لتحديد الصفوف في هذا الجدول بشكل فريد. إذا كنت تحتفظ بقائمة ورقية بأعضاء نادي الكتاب، يمكنك استخدام مُعرّفات إضافية لتمييز الأشخاص ذوي الأسماء المتشابهة ضمن المجموعة.
يمكنك القيام بشيء مماثل في قاعدة بيانات علائقية باستخدام عمود إضافي يحتوي على معرفات مُولَّدة غير حقيقية، والغرض الوحيد منه هو عزل جميع صفوف الجدول بشكل فريد. لنسمِّه "معرف العضو".
مع ذلك، يُعد إنشاء مثل هذا المُعرِّف في كل مرة تُريد فيها إضافة عضو جديد في نادي الكتاب إلى قاعدة البيانات أمرًا مُرهِقًا. لحل هذه المشكلة، يُوفر MySQL ميزة لزيادة قيمة الأعمدة الرقمية تلقائيًا، حيث تُزيد قاعدة البيانات قيمة العمود تلقائيًا بسلسلة من الأعداد الصحيحة.
لننشئ جدولًا مشابهًا للجدول السابق. ستضيف عمودًا إضافيًا للزيادة التلقائية (معرف العضو) لحفظ رقم مُخصص تلقائيًا لكل عضو في النادي. سيُستخدم هذا الرقم كمفتاح أساسي للجدول:
Member_id: يحتوي هذا العمود على معرف رقمي متزايد تلقائيًا يتم تمثيله بواسطة نوع البيانات int.
first_name: يحتوي هذا العمود على الاسم الأول لأعضاء النادي، والذي يتم تمثيله بنوع البيانات varchar المحدود بـ 50 حرفًا.
last_name: يحتوي هذا العمود على الاسم الأخير لأعضاء النادي، والذي يتم عرضه بنوع بيانات varchar يقتصر على 50 حرفًا.
لإنشاء الجدول، قم بتشغيل العبارة SQL التالية:
CREATE TABLE club_members (
member_id int AUTO_INCREMENT PRIMARY KEY,
first_name varchar(50),
last_name varchar(50)
);بينما تظهر عبارة PRIMARY KEY بعد تعريف نوع العمود، تمامًا كما هو الحال مع المفتاح الأساسي لعمود واحد، تظهر قبلها سمة إضافية: AUTO_INCREMENT. تُخبر هذه السمة MySQL بإنشاء قيم لهذا العمود تلقائيًا، ما لم تُحدد صراحةً، باستخدام تسلسل أرقام متزايد.
ملاحظة: خاصية AUTO_INCREMENT لتعريفات الأعمدة خاصة بـ MySQL. غالبًا ما توفر قواعد البيانات الأخرى أساليب مشابهة لتوليد المفاتيح المتسلسلة، ولكن تختلف الصياغة باختلاف المحرك. في حال وجود أي شك، نوصي بالرجوع إلى الوثائق الرسمية لنظام إدارة قواعد البيانات العلائقية (RDBMS) لديك.
إذا تمت طباعة الإخراج التالي، فقد تم إنشاء الجدول:
Output
Query OK, 0 rows affected (0.00 sec)بعد ذلك، قم بتحميل الجدول باستخدام الصفوف النموذجية المقدمة في المثال أعلاه عن طريق تنفيذ عملية INSERT INTO التالية:
INSERT INTO club_members (first_name, last_name) VALUES
('John', 'Doe'),
('Jane', 'Smith'),
('Bob', 'Johnson'),
('Samantha', 'Davis'),
('Michael', 'Rodriguez'),
('Tom', 'Thompson'),
('Sara', 'Johnson'),
('David', 'Jones'),
('Jane', 'Smith'),
('Bob', 'Johnson');يتضمن بيان INSERT الآن قائمة بأسماء الأعمدة (الاسم الأول والاسم الأخير)، مما يضمن أن قاعدة البيانات تعرف أن عمود Member_id غير متوفر في مجموعة البيانات، وبالتالي يجب أخذ القيمة الافتراضية له بدلاً من ذلك.
ستستجيب قاعدة البيانات برسالة نجاح:
Output
Query OK, 10 rows affected (0.002 sec)
Records: 10 Duplicates: 0 Warnings: 0استخدم عبارة SELECT للتحقق من البيانات الموجودة في الجدول الذي تم إنشاؤه حديثًا:
SELECT * FROM club_members;
يُظهر الإخراج جدولًا مشابهًا للجدول الموجود في بداية القسم:
Output
+-----------+------------+-----------+
| member_id | first_name | last_name |
+-----------+------------+-----------+
| 1 | John | Doe |
| 2 | Jane | Smith |
| 3 | Bob | Johnson |
| 4 | Samantha | Davis |
| 5 | Michael | Rodriguez |
| 6 | Tom | Thompson |
| 7 | Sara | Johnson |
| 8 | David | Jones |
| 9 | Jane | Smith |
| 10 | Bob | Johnson |
+-----------+------------+-----------+
10 rows in set (0.000 sec)ومع ذلك، هذه المرة، يظهر عمود Member_id في النتيجة ويحتوي على تسلسل من الأرقام من 1 إلى 10. باستخدام هذا العمود، لم تعد الصفوف المكررة لـ Jane Smith وBob Johnson قابلة للتعرف عليها لأن كل اسم مرتبط بمعرف فريد (Member_id).
الآن، دعونا نتحقق ما إذا كانت قاعدة البيانات تسمح لنا بإضافة توم تومسون آخر إلى قائمة عضوية النادي:
INSERT INTO club_members (first_name, last_name) VALUES ('Tom', 'Thompson');
سيستجيب MySQL برسالة نجاح:
Output
Query OK, 1 row affected (0.009 sec)
للتحقق من معرف الرقم الذي قامت قاعدة البيانات بتعيينه للإدخال الجديد، قم بتشغيل استعلام SELECT مرة أخرى:
SELECT * FROM club_members;
هناك صف آخر في الإخراج:
Output
+-----------+------------+-----------+
| member_id | first_name | last_name |
+-----------+------------+-----------+
| 1 | John | Doe |
| 2 | Jane | Smith |
| 3 | Bob | Johnson |
| 4 | Samantha | Davis |
| 5 | Michael | Rodriguez |
| 6 | Tom | Thompson |
| 7 | Sara | Johnson |
| 8 | David | Jones |
| 9 | Jane | Smith |
| 10 | Bob | Johnson |
| 11 | Tom | Thompson |
+-----------+------------+-----------+
11 rows in set (0.000 sec)تم تعيين الرقم 11 تلقائيًا إلى صف جديد في عمود Member_id عبر سمة AUTO_INCREMENT الخاصة بقاعدة البيانات.
إذا كانت البيانات التي تعمل عليها لا تحتوي على مرشحين طبيعيين للمفاتيح الأساسية، ولا تريد التوصل إلى معرفات مخترعة في كل مرة تضيف فيها بيانات جديدة إلى قاعدة البيانات، فيمكنك الاعتماد بأمان على المعرفات المولدة بشكل متسلسل كمفاتيح أساسية.
نتيجة
باتباع هذا الدليل، تعلّمتَ ماهية المفاتيح الأساسية وكيفية إنشاء أنواع شائعة في MySQL لتحديد الصفوف الفريدة في جداول قاعدة البيانات. أنشأتَ مفاتيح أساسية طبيعية، ومفاتيح أساسية تمتد على عدة أعمدة، واستخدمتَ مفاتيح متسلسلة متزايدة تلقائيًا حيث لا توجد مفاتيح طبيعية.









