في هذا الدرس 6تصفّح المواضيع
عندما يحاول أمر INSERT إدراج سجل تتطابق فيه قيمة المفتاح الأساسي PRIMARY KEY أو الفريد UNIQUE مع سجل موجود مسبقاً في الجدول، يوقف MySQL التنفيذ فوراً ويُرجع الخطأ Error 1062 (23000): Duplicate entry. وفي الأنظمة عالية التزامن (كمزامنة المخزون، أو عدادات الزيارات، أو معالجة الإشعارات المتكررة)، يوفر MySQL ثلاث آليات أصلية لمعالجة التعارض دون توقف:
- التخطي الآمن
INSERT IGNORE: يحوّل خطأ التكرار إلى تحذير ويتخطى السجل المكرر مع الاحتفاظ بالسجل القديم كما هو. - الإدراج أو التحديث
ON DUPLICATE KEY UPDATE(Upsert): يدرج السجل إن كان جديداً، أو يحدّث أعمدة السجل الموجود في مكانه عند حدوث تعارض. - الاستبدال الكامل
REPLACE INTO: يحذف السجل القديم المتعارض كلياً ثم يدرج السجل الجديد من الصفر.
CREATE TABLE inventory_counters (
sku_code VARCHAR(32) NOT NULL,
stock_qty INT UNSIGNED NOT NULL DEFAULT 0,
sync_runs INT UNSIGNED NOT NULL DEFAULT 1,
PRIMARY KEY (sku_code)
);
تُوجّه الكلمة المفتاحية IGNORE بعد INSERT خادم MySQL إلى تجاهل أي صف يسبب تعارضاً في مفتاح أساسي أو فريد دون إجهاض بقية الصفوف السليمة داخل نفس الدفعة المتعددة:
INSERT IGNORE INTO inventory_counters (sku_code, stock_qty)
VALUES
('KB-800', 25),
('KB-800', 99),
('MS-200', 40);
يدمج أسلوب Upsert عبر الصيغة INSERT ... ON DUPLICATE KEY UPDATE بين الإدراج والتحديث في استعلام ذري واحد؛ فإذا كان المفتاح جديداً يُدرج السجل، وإذا وُجد المفتاح مسبقاً ينفذ MySQL التعديلات المحددة بعد UPDATE على السجل القائم مباشرةً:
INSERT INTO inventory_counters (sku_code, stock_qty, sync_runs)
VALUES ('KB-800', 50, 1)
ON DUPLICATE KEY UPDATE
stock_qty = stock_qty + 50,
sync_runs = sync_runs + 1;
عند تنفيذ عملية Upsert لعدة صفوف دفعةً واحدة، تحتاج إلى الإشارة للقيم الجديدة المقترحة لكل صف داخل جملة التحديث. وبدءاً من إصدار MySQL 8.0.19+، اعتُمدت صيغة الاسم المستعار للصف (مثل AS incoming) بعد قائمة VALUES بدلاً من الدالة القديمة VALUES(col):
INSERT INTO inventory_counters (sku_code, stock_qty)
VALUES
('KB-800', 30),
('MN-4K', 15) AS incoming
ON DUPLICATE KEY UPDATE
stock_qty = inventory_counters.stock_qty + incoming.stock_qty,
sync_runs = inventory_counters.sync_runs + 1;
يعمل الأمر الخاص بـ MySQL REPLACE INTO كإدراج عادي عند عدم وجود تعارض، لكنه عند مصادفة مفتاح مكرر يقوم بحذف السجل القديم فعلياً ثم إدراج السجل الجديد. ونظراً لأنه ينفذ عملية DELETE متبوعة بعملية INSERT، فإن الأعمدة غير المذكورة في الأمر تعود إلى قيمتها الافتراضية DEFAULT، كما قد يتغير رقم AUTO_INCREMENT وتتأثر الجداول التابعة المرتبطة بمفتاح أجنبي:
-- Deletes existing 'KB-800' row and inserts a fresh row
REPLACE INTO inventory_counters (sku_code, stock_qty)
VALUES ('KB-800', 100);
يقارن الجدول الشامل التالي بين آليات التعامل مع تعارض المفاتيح المكررة في MySQL 8:
| الأمر | الإجراء عند تكرار المفتاح | هل يحفظ الأعمدة غير المذكورة؟ | الحالة الهندسية الموصى بها |
|---|---|---|---|
INSERT INTO | يُجهض العملية بالخطأ 1062 | نعم (لا يتم التعديل) | العمليات الصارمة التي يُعد فيها التكرار خطأً برمجياً |
INSERT IGNORE | يتخطى الصف المتعارض مع تحذير | نعم (يبقى السجل القديم كما هو) | استيراد الدفعات مع تخطي السجلات المسجلة مسبقاً |
ON DUPLICATE KEY UPDATE | يحدّث الأعمدة المحددة في مكانها | نعم (يعدّل الأعمدة المستهدفة فقط) | التحديث الموضعي الآمن وعدادات المخزون والمزامنة |
REPLACE INTO | يحذف الصف القديم ويدرج الجديد | لا (تعود إلى DEFAULT) | استبدال جداول التخزين المؤقت غير المرتبطة بمفاتيح أجنبية |
ملخص الدرس: أتقنت في هذا الدرس معالجة تعارضات المفاتيح الفريدة عبر INSERT IGNORE، والتحديث الموضعي الذري عبر ON DUPLICATE KEY UPDATE مع الاسم المستعار للصف (AS incoming) في MySQL 8، والفرق الجوهري بينه وبين REPLACE INTO.
الخطوة التالية والدرس القادم: انتقل الآن إلى درس «استعلام البيانات بأمر SELECT والأسماء المستعارة و DISTINCT» لاسترجاع وعرض السجلات باحترافية.
ملخص الدرس
حصاد الدرسمراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي
ماذا تعلّمت في هذا الدرس؟
اعتمد دائماً صياغة INSERT ... AS incoming ON DUPLICATE KEY UPDATE للتحديث الموضعي الآمن في MySQL 8. الخطوة التالية: انتقل إلى درس «استعلام البيانات بأمر SELECT والأسماء المستعارة و DISTINCT».
سجّل الدخول لحفظ تقدمك
تابع إنجاز المواضيع والمصطلحات والمهام، وكمّل من آخر خطوة على أي جهاز.
المصطلحات5
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 MySQL Upsert معالجة التكرار
- تعلّم معالجة تعارض المفاتيح المكررة عبر INSERT IGNORE و Upsert بأسلوب MySQL 8 الحديث مع أمثلة استعلامات SQL وتطبيقات تفاعلية.
- للمراجعة
- 02 Duplicate Key Conflicts in MySQL تعارض المفاتيح المكررة في MySQL
- المفهوم الهندسي والصياغة العملية الخاصة بقسم تعارض المفاتيح المكررة في MySQL في MySQL 8.
- للمراجعة
- 03 Skipping Duplicates with INSERT IGNORE تخطي التكرار بأمر INSERT IGNORE
- المفهوم الهندسي والصياغة العملية الخاصة بقسم تخطي التكرار بأمر INSERT IGNORE في MySQL 8.
- للمراجعة
- 04 Upserting with ON DUPLICATE KEY التحديث التلقائي ON DUPLICATE KEY
- المفهوم الهندسي والصياغة العملية الخاصة بقسم التحديث التلقائي ON DUPLICATE KEY في MySQL 8.
- للمراجعة
- 05 MySQL 8 Row Alias Upsert الاسم المستعار للصف في Upsert
- المفهوم الهندسي والصياغة العملية الخاصة بقسم الاسم المستعار للصف في Upsert في MySQL 8.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
الاختصارات4
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 UPSERT UPSERT
- Update or Insert Operation
- عملية ذرية تدمج بين إدراج سجل جديد أو تحديث السجل القائم عند حدوث تعارض في مفتاح فريد.
- للمراجعة
- 02 IODKU IODKU
- INSERT ... ON DUPLICATE KEY UPDATE
- صياغة MySQL الأصلية لتنفيذ التحديث الموضعي عند تكرار المفتاح الأساسي أو الفريد.
- للمراجعة
- 03 PK PK
- Primary Key
- المفتاح الأساسي للجدول الذي يؤدي تكراره إلى تفعيل آليات معالجة التعارض.
- للمراجعة
- 04 DML DML
- Data Manipulation Language
- أوامر معالجة البيانات داخل الجداول مثل الإدراج والاستبدال والاستعلام والتحديث والحذف.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
مهامك قبل الاختبار
خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.
-
نفّذ أمثلة SQL المشروحة في قسم تعارض المفاتيح المكررة في MySQL داخل قاعدة بياناتك المحلية وتحقق من النتيجة.
-
بدّل بين الحالات التفاعلية في قسم تخطي التكرار بأمر INSERT IGNORE وقارن كيف يعالج محرك MySQL 8 كل أمر.
تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.
اختبر فهمك.
ووصلها للإتقان.
كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.
أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.
الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.
لمحة عن التحدي4 أسئلة تنتظرك +
أي أنواع الفهارس تؤدي إلى تفعيل معالجة التعارض في ON DUPLICATE KEY UPDATE أو INSERT IGNORE؟
تعمل معالجة التكرار حصرياً عند حدوث تعارض في مفاتيح PRIMARY KEY أو فهارس UNIQUE الفريدة.
ماذا يفعل الأمر INSERT IGNORE عندما ينتهك صف واحد ضمن دفعة متعددة قيد الفردية UNIQUE؟
يتخطى الصف المتعارض مع تسجيل تحذير، ويواصل إدراج بقية الصفوف السليمة في الدفعة.
في إصدار MySQL 8.0.19+، ما الصياغة الحديثة الموصى بها للإشارة إلى القيم الجديدة الواردة داخل جملة ON DUPLICATE KEY UPDATE؟
تعريف اسم مستعار للصف بعد VALUES مثل AS incoming ثم الإشارة إلى الأعمدة عبر incoming.col_name.
عند حدوث تكرار في المفتاح، يقوم الأمر REPLACE INTO بحذف السجل القديم فعلياً وإدراج سجل جديد، مما يعيد الأعمدة غير المذكورة إلى قيمتها الافتراضية DEFAULT.
صواب؛ ينفذ الأمر REPLACE INTO عملية حذف ثم إدراج، ولذلك يُفضّل عليه ON DUPLICATE KEY UPDATE للتحديث الموضعي.