دمج (SQL)

يستخدم نظام إدارة قواعد البيانات العلائقية عبارات SQL MERGE (وتُسمى أيضًا upsert) لإدراج سجلات جديدة أو تحديث أو حذف سجلات موجودة ، وذلك بناءً على تحقق شرط معين. وقد تم تقديمها رسميًا في معيار SQL:2003 ، وتم توسيع نطاقها في معيار SQL:2008 .

الاستخدام

دمج في جدول اسم الجدول باستخدام مرجع الجدول على ( الشرط ) عند التطابق ، قم بتحديث العمود 1 = القيمة 1 [ ، العمود 2 = القيمة 2 ... ] عند عدم التطابق ، قم بإدراج ( العمود 1 [ ، العمود 2 ... ] ) القيم ( القيمة 1 [ ، القيمة 2 ... ] 

يتم استخدام الربط الأيمن بين الجدول الهدف ( جدول الإدخال ) والجدول المصدر ( جدول/عرض/استعلام فرعي باستخدام ) - حيث يمثل الجدول الهدف الجدول الأيسر، ويمثل الجدول المصدر الجدول الأيمن. وتؤدي التركيبات الأربعة الممكنة إلى القواعد التالية:

  • إذا تطابق حقل (حقول) التشغيل في المصدر مع حقل (حقول) التشغيل في الهدف، فقم بالتحديث.
  • إذا لم تتطابق حقول التشغيل في المصدر مع حقول التشغيل في الهدف، فقم بالإدراج.
  • إذا لم يكن حقل التشغيل موجودًا في المصدر ولكنه موجود في الهدف، فلن يتم تنفيذ أي إجراء.
  • إذا لم يكن حقل التشغيل موجودًا في المصدر أو الهدف، فلن يتم تنفيذ أي إجراء.

إذا تطابقت عدة صفوف من المصدر مع صف هدف معين، فإن معايير SQL:2003 تفرض حدوث خطأ . لا يمكنك تحديث صف هدف عدة مرات باستخدام عبارة MERGE.

التطبيقات

تدعم أنظمة إدارة قواعد البيانات PostgreSQL ، [ 1 ] وقاعدة بيانات Oracle ، و IBM Db2 ، وTeradata ، و EXASOL ، وFirebird ، وCUBRID ، وH2 ، و HSQLDB ، و MS SQL ، وMonetDB ، و Vectorwise ، و Apache Derby الصيغة القياسية. كما يضيف بعضها امتدادات SQL غير قياسية.

مرادف

اعتمدت بعض تطبيقات قواعد البيانات مصطلح "upsert" (وهو مصطلح مُركّب من "update" و "insert ") للإشارة إلى عبارة أو مجموعة عبارات في قاعدة البيانات ، تُستخدم لإضافة سجل إلى جدول في قاعدة البيانات إذا لم يكن موجودًا، أو لتحديث السجل الموجود إذا كان موجودًا بالفعل. يُستخدم هذا المصطلح في PostgreSQL (الإصدار 9.5 وما بعده) [ 2 ] و SQLite (الإصدار 3.24 وما بعده) [ 3 ] . كما يُستخدم أيضًا لاختصار الشفرة الزائفة المُكافئة لـ "MERGE".

يُستخدم في قاعدة بيانات Microsoft Azure SQL . [ 4 ]

تطبيقات أخرى غير قياسية

تدعم بعض أنظمة إدارة قواعد البيانات الأخرى هذا السلوك، أو سلوكًا مشابهًا جدًا، من خلال امتدادات SQL الخاصة بها وغير القياسية.

يدعم MySQL ، على سبيل المثال، استخدام الصيغة [ 5 ] التي يمكن استخدامها لتحقيق تأثير مشابه، مع مراعاة أن الربط بين المصدر والهدف يجب أن يتم فقط باستخدام قيود المفتاح الأساسي أو الفريد، وهو أمر غير مطلوب في معيار ANSI/ISO. كما يدعم الصيغة [ 6 ] التي تحاول أولاً إدراج البيانات، وإذا فشلت، تحذف الصف الموجود، ثم تُدرج الصف الجديد. يوجد أيضًا بند في العبارة [ 7 ] يُخبر الخادم بتجاهل أخطاء "المفتاح المكرر" والمتابعة (لن تُدرج الصفوف الموجودة أو تُحدّث، ولكن ستُدرج جميع الصفوف الجديدة).INSERT...ONDUPLICATEKEYUPDATE>REPLACE INTOIGNOREINSERT

يعمل SQLite بشكل مشابه. كما أنه يدعم اسمًا بديلًا للتوافق مع MySQL. [ 8 ]INSERTORREPLACEINTOREPLACE INTO

يدعم FirebirdMERGE INTO خاصية الإضافة، لكنه لا يُظهر خطأً عند وجود عدة صفوف من بيانات المصدر. بالإضافة إلى ذلك، توجد نسخة تدعم صفًا واحدًا، لكنها لا تتيح خيار اتخاذ إجراءات مختلفة عند الإضافة مقارنةً بالتحديث (مثل تعيين قيمة تسلسل جديدة للصفوف الجديدة فقط، وليس للصفوف الموجودة).UPDATEORINSERTINTOtablename(columns)VALUES(values)[MATCHING(columns)]

يقوم IBM Db2 بتوسيع بناء الجملة باستخدام عبارات " WHEN MATCHEDو " متعددة WHEN NOT MATCHED، مع تمييزها باستخدام ... AND some-conditionالحراس .

يدعم Microsoft SQL Server الحماية ويدعم أيضًا الربط الخارجي الأيسر عبر العبارات.WHENNOTMATCHEDBYSOURCE

يدعم PostgreSQL عملية الدمج منذ الإصدار 15، ولكنه كان يدعم سابقًا الدمج عبر . [ 9 ]INSERTINTO...ONCONFLICT[conflict_target]conflict_action

يدعم CUBRID عبارة MERGE INTO[ 10 ] . ويدعم استخدام الصيغة. [ 11 ] كما يدعم التوافق مع MySQL. [ 12 ]INSERT...ONDUPLICATEKEYUPDATEREPLACE INTO

يدعم Apache Phoenix الصيغة UPSERT VALUES[ 13 ] و UPSERT SELECT[ 14 ] .

يدعم Spark SQLUPDATE SET * عبارات AND INSERT *في الإجراءات. [ 15 ]

يدعم Apache ImpalaUPSERT INTO ... SELECT . [ 16 ]

الاستخدام في NoSQL

يتم تطبيق مفهوم مماثل في بعض قواعد بيانات NoSQL .

في MongoDB، يمكن تحديث الحقول المرتبطة بمفتاح معين باستخدام updateعملية معينة. updateتُصدر هذه العملية خطأً في حال عدم العثور على المفتاح. updateويمكن تحديد upsertخيار في هذه العملية: في هذه الحالة، تُخزَّن قيمة جديدة مرتبطة بالمفتاح المحدد إذا لم تكن موجودة، وإلا تُستبدل القيمة بالكامل.

في Redis، تُعيّن العمليات SETالقيمة المرتبطة بمفتاح مُحدد. لا يعرف Redis أي تفاصيل عن البنية الداخلية للقيمة، لذا فإن التحديث لا معنى له. لذلك، SETتحمل العملية دائمًا دلالات التعيين أو الاستبدال .

انظر أيضاً

مراجع

  1. "E.1. الإصدار 15" . وثائق PostgreSQL . 13 أكتوبر 2022. مؤرشف من الأصل في 13 أكتوبر 2022. تم الاطلاع عليه في 13 أكتوبر 2022 .
  2. "عملية إدراج/تحديث في PostgreSQL باستخدام عبارة INSERT ON CONFLICT" . دليل PostgreSQL . مؤرشف من الأصل بتاريخ 28 نوفمبر 2022.
  3. " upsert "، SQLite، تمت زيارته في 6-6-2018.
  4. "دمج (ترانزاكت-إس كيو إل)" . مرجع ترانزاكت-إس كيو إل (محرك قاعدة البيانات) . مايكروسوفت ليرن. مؤرشف من الأصل في 24 يونيو 2016.
  5. MySQL  :: دليل مرجعي لـ MySQL 5.1  :: 12.2.4.3 صيغة INSERT ... ON DUPLICATE KEY UPDATE
  6. دليل مرجع MySQL 5.1: 11.2.6 صيغة REPLACE
  7. "دليل مرجعي لـ MySQL 5.5 :: 13.2.5 صيغة INSERT" . تم الاطلاع عليه بتاريخ 29 أكتوبر 2013 . 
  8. "SQL كما يفهمها SQLite: INSERT" . تم الاطلاع عليه بتاريخ 27-09-2012 .
  9. صفحة إدراج PostgreSQL
  10. "CUBRID 9.0.0 الجديد" . مدونة CUBRID الرسمية. 30 أكتوبر 2012. تاريخ الاطلاع: 8 نوفمبر 2012 .
  11. CUBRID  :: عبارات معالجة البيانات  :: إدراج  :: عبارة ON DUPLICATE KEY UPDATE
  12. CUBRID  :: عبارات معالجة البيانات  :: استبدال
  13. "إدراج القيم" .
  14. "UPSERT SELECT" .
  15. "MERGE INTO (Delta Lake on Databricks)" .
  16. "عبارة UPSERT (وثائق أباتشي إمبالا)" .