MySQL AUTO_INCREMENT مع الأمثلة
⚡ ملخص ذكي
MySQL تُنشئ خاصية الترقيم التلقائي (AUTO_INCREMENT) أرقامًا متسلسلة تلقائيًا لعمود رقمي في كل مرة يتم فيها إدراج صف. تُغني هذه الخاصية عن الحاجة إلى حساب المعرفات الفريدة يدويًا، مما يجعلها الطريقة القياسية لتعبئة المفتاح الأساسي.

ما هي الزيادة التلقائية؟
الزيادة التلقائية هي وظيفة تعمل على أنواع البيانات الرقمية. فهي تولد تلقائيًا قيمًا رقمية متسلسلة في كل مرة يتم فيها إدراج سجل في جدول لحقل محدد كزيادة تلقائية.
تعمل هذه الخاصية مع أي نوع من أنواع الأعداد الصحيحة، من TINYINT إلى BIGINT. يجب أيضًا فهرسة العمود، وهو ما يحدث تلقائيًا عند تعريفه كمفتاح أساسي.
متى تستخدم الزيادة التلقائية؟
في الدرس حول تطبيع قاعدة البياناتلقد نظرنا في كيفية تخزين البيانات بأقل قدر من التكرار، وذلك عن طريق تخزين البيانات في العديد من الجداول الصغيرة، المرتبطة ببعضها البعض باستخدام المفاتيح الأساسية والأجنبية.
يجب أن يكون المفتاح الأساسي فريدًا، لأنه يُعرّف صفًا واحدًا في قاعدة البيانات بشكل فريد. ولكن كيف نضمن أن يكون المفتاح الأساسي فريدًا دائمًا؟
أحد الحلول الممكنة هو استخدام صيغة لإنشاء المفتاح الأساسي، تتحقق من وجود المفتاح في الجدول قبل إضافة البيانات. قد ينجح هذا الحل، لكنه معقد وغير مضمون النتائج. قد تصل جلستان تُدخلان البيانات في الوقت نفسه إلى نفس القيمة القصوى، ما يؤدي إلى حدوث تعارض.
ولتجنب هذا التعقيد، ولضمان أن يكون المفتاح الأساسي فريدًا دائمًا، يمكننا استخدام MySQL تُستخدم خاصية الترقيم التلقائي لإنشاء المفاتيح الأساسية. وتُستخدم هذه الخاصية مع نوع البيانات INT، الذي يدعم القيم الموقعة وغير الموقعة. لا يمكن أن تحتوي أنواع البيانات غير الموقعة إلا على أعداد موجبة. ومن أفضل الممارسات تحديد قيد "غير موقع" على المفتاح الأساسي ذي الترقيم التلقائي.
بناء جملة الزيادة التلقائية
بعد التوصل إلى المنطق، انظر إلى النص البرمجي المستخدم لإنشاء جدول فئات الأفلام.
CREATE TABLE `categories` ( `category_id` int UNSIGNED NOT NULL AUTO_INCREMENT, `category_name` varchar(150) DEFAULT NULL, `remarks` varchar(500) DEFAULT NULL, PRIMARY KEY (`category_id`) );
لاحظ خاصية "AUTO_INCREMENT" في حقل category_id. هذه الخاصية تُنشئ معرّف الفئة تلقائيًا في كل مرة يُضاف فيها صف جديد إلى الجدول. ولا يتم إدخال هذا المعرّف عند إدخال البيانات في الجدول. MySQL يولد ذلك.
ملاحظة: تُضاعف الكلمة المفتاحية UNSIGNED النطاق الموجب للعمود، ويتم إهمال عرض العرض الذي كان يُكتب سابقًا كـ int(11). MySQL 8.0.17 وما بعده. عادي مادبا هذا هو الشكل الحالي.
بشكل افتراضي، تكون القيمة الابتدائية لـ AUTO_INCREMENT هي 1، وستزداد بمقدار 1 لكل سجل جديد.
دعونا نلقي نظرة على المحتويات الحالية لجدول الفئات.
SELECT * FROM `categories`;
تنفيذ البرنامج النصي أعلاه في MySQL يعطينا برنامج Workbench النتائج التالية عند استخدامه مع قاعدة بيانات myflixdb.
| category_id | category_name | remarks |
|---|---|---|
| 1 | Comedy | Movies with humour |
| 2 | Romantic | Love stories |
| 3 | Epic | Story acient movies |
| 4 | Horror | NULL |
| 5 | Science Fiction | NULL |
| 6 | Thriller | NULL |
| 7 | Action | NULL |
| 8 | Romantic Comedy | NULL |
يوجد ثمانية صفوف، لذا يجب أن يكون المعرف التالي الذي تم إنشاؤه هو 9. لنقم الآن بإدراج فئة جديدة في جدول الفئات، مع توفير الاسم فقط.
INSERT INTO `categories` (`category_name`) VALUES ('Cartoons');
تنفيذ البرنامج النصي أعلاه ضد myflixdb في MySQL طاولة العمل يعطينا النتائج التالية الموضحة أدناه.
| category_id | category_name | remarks |
|---|---|---|
| 1 | Comedy | Movies with humour |
| 2 | Romantic | Love stories |
| 3 | Epic | Story acient movies |
| 4 | Horror | NULL |
| 5 | Science Fiction | NULL |
| 6 | Thriller | NULL |
| 7 | Action | NULL |
| 8 | Romantic Comedy | NULL |
| 9 | Cartoons | NULL |
لاحظ أننا لم نقم بتزويد معرف الفئة. MySQL تم إنشاؤه تلقائيًا، لأن معرف الفئة مُعرّف على أنه زيادة تلقائية.
إذا كنت تريد الحصول على آخر معرف إدراج تم إنشاؤه بواسطة MySQLيمكنك استخدام الدالة LAST_INSERT_ID للقيام بذلك. يحصل البرنامج النصي الموضح أدناه على آخر معرف تم إنشاؤه.
SELECT LAST_INSERT_ID();
يُظهر تنفيذ البرنامج النصي أعلاه آخر رقم ترقيم تلقائي تم إنشاؤه بواسطة استعلام INSERT. النتائج معروضة أدناه.
تلميح: يقتصر نطاق LAST_INSERT_ID() على اتصالك الخاص، لذلك لا يمكن أبدًا إرجاع قيمة تم إنشاؤها بواسطة عملية إدراج لمستخدم آخر إليك عن طريق الخطأ.
كيفية ضبط أو إعادة ضبط قيمة بدء الترقيم التلقائي
يبدأ التسلسل الافتراضي من الرقم 1، ولكن هذا ليس ما يحتاجه المشروع دائمًا. قد يتعين الاستمرار في ترقيم الفواتير من نظام قديم، وغالبًا ما يتطلب الأمر إعادة ضبط جدول الاختبار. MySQL يكشف العداد مباشرةً، لذا تتم معالجة الحالتين بشرط واحد. اتبع هذه الخطوات للتحكم في رقم البداية.
- قم بتعيين القيمة عند وقت الإنشاء. أضف عبارة AUTO_INCREMENT إلى عبارة CREATE TABLE. سيحصل الصف الأول المُدرج حينها على هذا الرقم بدلاً من 1.
- قم بتغيير القيمة في جدول موجود. استعمل تغيير الجدول بنفس البند. MySQL لا يقبل الرقم الجديد إلا إذا كان أعلى من أكبر مُعرّف مُخزّن حاليًا.
- أعد ضبط جدول قمت بتفريغه. يقوم الأمر TRUNCATE TABLE بإزالة جميع الصفوف وإعادة العداد إلى 1 في عملية واحدة، وهو ما لا يفعله الأمر DELETE وحده.
- قم بتأكيد التغيير. قم بإدراج صف واقرأ المعرف مرة أخرى باستخدام LAST_INSERT_ID() قبل الاعتماد على التسلسل الجديد.
-- Start a brand-new table at 1000 CREATE TABLE `invoices` ( `invoice_id` int UNSIGNED NOT NULL AUTO_INCREMENT, `amount` decimal(10,2), PRIMARY KEY (`invoice_id`) ) AUTO_INCREMENT = 1000; -- Move the counter on an existing table ALTER TABLE `categories` AUTO_INCREMENT = 100; -- Empty the table and reset the counter to 1 TRUNCATE TABLE `categories`;
يمكن أيضًا تغيير حجم الخطوة باستخدام متغير النظام auto_increment_increment، ولكنه ينطبق على الخادم بأكمله وليس على جدول واحد. ويُستخدم بشكل أساسي في النسخ المتماثل، حيث يجب ألا يُنشئ خادمان نفس المعرّف.
لماذا تظهر الفجوات في تسلسل الزيادة التلقائية؟
عاجلاً أم آجلاً، سيظهر في الجدول مُعرّفات مثل 1، 2، 5، 6. لا يوجد أي خلل. صُمم العداد لضمان التفرد، وليس لضمان سلسلة متصلة من الأرقام، ولا يُصدر القيمة نفسها مرتين.
تظهر الفجوات للأسباب التالية.
- الصفوف المحذوفة: عند حذف صف من جدول، لا يتم إعادة استخدام معرفه الذي تم زيادته تلقائيًا. MySQL يستمر في توليد أرقام جديدة بشكل متسلسل.
- المعاملات التي تم التراجع عنها: يتم حجز الرقم لحظة تنفيذ عملية الإدخال. إذا تم التراجع عن العملية، يختفي الصف ولكن الرقم يكون قد تم استخدامه بالفعل.
- عمليات الإدخال الفاشلة: يمكن لعبارة مرفوضة بواسطة قيد فريد أن تستهلك معرفًا قبل أن تفشل.
- إضافات بالجملة: قد يقوم محرك InnoDB بحجز مجموعة من الأرقام لإدراج متعدد الصفوف والتخلص من الأرقام التي لا يستخدمها.
محاولة سدّ هذه الثغرات خطأ. إعادة ترقيم الصفوف تُعطّل جميع المفاتيح الخارجية التي تُشير إليها، والقيمة نفسها لا تحمل أي معنى عملي. إذا كان التقرير يتطلب قائمة متصلة، فقم بإنشاء رقم الصف في الاستعلام بدلاً من إعادة كتابة البيانات المخزنة.

