انتقل إلى محتوى الدرس
الدرس 22
دورة MySQL

معالجة تعارض المفاتيح المكررة عبر INSERT IGNORE و UpsertMySQL Handling Duplicates with INSERT IGNORE and Upsert

تعلّم معالجة تعارض المفاتيح المكررة عبر INSERT IGNORE و Upsert بأسلوب MySQL 8 الحديث مع أمثلة استعلامات SQL وتطبيقات تفاعلية.
أقسام الدرس
6
الأمثلة
5
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
8
محتوى الدرس
في هذا الدرس 6تصفّح المواضيع

عندما يحاول أمر INSERT إدراج سجل تتطابق فيه قيمة المفتاح الأساسي PRIMARY KEY أو الفريد UNIQUE مع سجل موجود مسبقاً في الجدول، يوقف MySQL التنفيذ فوراً ويُرجع الخطأ Error 1062 (23000): Duplicate entry. وفي الأنظمة عالية التزامن (كمزامنة المخزون، أو عدادات الزيارات، أو معالجة الإشعارات المتكررة)، يوفر MySQL ثلاث آليات أصلية لمعالجة التعارض دون توقف:

  • التخطي الآمن INSERT IGNORE: يحوّل خطأ التكرار إلى تحذير ويتخطى السجل المكرر مع الاحتفاظ بالسجل القديم كما هو.
  • الإدراج أو التحديث ON DUPLICATE KEY UPDATE (Upsert): يدرج السجل إن كان جديداً، أو يحدّث أعمدة السجل الموجود في مكانه عند حدوث تعارض.
  • الاستبدال الكامل REPLACE INTO: يحذف السجل القديم المتعارض كلياً ثم يدرج السجل الجديد من الصفر.
مخطط يقارن بين تخطي التكرار عبر INSERT IGNORE والتحديث الموضعي Upsert والاستبدال الكامل REPLACE INTO في MySQL 8
SQL
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 إلى تجاهل أي صف يسبب تعارضاً في مفتاح أساسي أو فريد دون إجهاض بقية الصفوف السليمة داخل نفس الدفعة المتعددة:

SQL
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 على السجل القائم مباشرةً:

SQL
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):

SQL
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 وتتأثر الجداول التابعة المرتبطة بمفتاح أجنبي:

SQL
-- 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

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 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

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 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
أوامر معالجة البيانات داخل الجداول مثل الإدراج والاستبدال والاستعلام والتحديث والحذف.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

من الفهم للتطبيق

مهامك قبل الاختبار

خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.

0/2مهام منجزة
  1. نفّذ أمثلة SQL المشروحة في قسم تعارض المفاتيح المكررة في MySQL داخل قاعدة بياناتك المحلية وتحقق من النتيجة.

  2. بدّل بين الحالات التفاعلية في قسم تخطي التكرار بأمر INSERT IGNORE وقارن كيف يعالج محرك MySQL 8 كل أمر.

تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.

مساحة التحدي

اختبر فهمك.
ووصلها للإتقان.

كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.

4أسئلة 2أنواع تحديات 100%هدف الإتقان
تصحيح تلقائي. فرص بلا حدود.

أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.

الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.

لمحة عن التحدي4 أسئلة تنتظرك
01

أي أنواع الفهارس تؤدي إلى تفعيل معالجة التعارض في ON DUPLICATE KEY UPDATE أو INSERT IGNORE؟

تعمل معالجة التكرار حصرياً عند حدوث تعارض في مفاتيح PRIMARY KEY أو فهارس UNIQUE الفريدة.

02

ماذا يفعل الأمر INSERT IGNORE عندما ينتهك صف واحد ضمن دفعة متعددة قيد الفردية UNIQUE؟

يتخطى الصف المتعارض مع تسجيل تحذير، ويواصل إدراج بقية الصفوف السليمة في الدفعة.

03

في إصدار MySQL 8.0.19+، ما الصياغة الحديثة الموصى بها للإشارة إلى القيم الجديدة الواردة داخل جملة ON DUPLICATE KEY UPDATE؟

تعريف اسم مستعار للصف بعد VALUES مثل AS incoming ثم الإشارة إلى الأعمدة عبر incoming.col_name.

04

عند حدوث تكرار في المفتاح، يقوم الأمر REPLACE INTO بحذف السجل القديم فعلياً وإدراج سجل جديد، مما يعيد الأعمدة غير المذكورة إلى قيمتها الافتراضية DEFAULT.

صواب؛ ينفذ الأمر REPLACE INTO عملية حذف ثم إدراج، ولذلك يُفضّل عليه ON DUPLICATE KEY UPDATE للتحديث الموضعي.