البرمجة

UPSERT في PostgreSQL: إدراج وتحديث البيانات

عند العمل على قواعد البيانات PostgreSQL بنسخة 9.5 فأكثر، قد تواجه تحديات في إدارة عملية إدراج وتحديث البيانات بطريقة فعّالة وفعّالة. من بين هذه التحديات هو الحاجة إلى معرفة عدد الصفوف التي تم إدراجها وتحديثها، بالإضافة إلى التعامل مع الصفوف التي لم يتم إدراجها بسبب قيود القيد.

للقيام بذلك، يمكنك استخدام الأمر UPSERT (الذي يدعم إدراج أو تحديث البيانات) مع استخدام تعبيرات العودة RETURNING لاسترداد البيانات المطلوبة. هنا هي الطريقة التي يمكنك استخدامها لتحقيق متطلباتك:

sql
WITH inserted AS ( INSERT INTO user_logins (username, logins) VALUES ('Naomi', 1), ('James', 1) ON CONFLICT (username) DO NOTHING RETURNING * ), updated AS ( UPDATE user_logins SET logins = user_logins.logins + EXCLUDED.logins WHERE user_logins.username IN (SELECT username FROM inserted) RETURNING * ) SELECT (SELECT COUNT(*) FROM inserted) AS inserted_rows, (SELECT COUNT(*) FROM updated) AS updated_rows, (SELECT COUNT(*) FROM user_logins WHERE username IN ('Naomi', 'James')) AS constraint_violations;

في هذا الاستعلام:

  1. نستخدم الجملة المشتركة WITH لتنفيذ إدراج الصفوف باستخدام الأمر INSERT INTO ونستخدم RETURNING * لاسترداد الصفوف التي تم إدراجها.
  2. ثم نستخدم الجملة المشتركة مرة أخرى لتحديث الصفوف باستخدام الأمر UPDATE مع الأمر ON CONFLICT DO NOTHING. هذا الجزء من الاستعلام يعمل على تحديث الصفوف إذا كانت موجودة مسبقًا في الجدول، ويستخدم RETURNING * لاسترداد الصفوف التي تم تحديثها.
  3. أخيرًا، نستخدم جملة SELECT لاسترداد عدد الصفوف التي تم إدراجها، وعدد الصفوف التي تم تحديثها، وعدد الصفوف التي تم تجاوزها بسبب قيود القيد.

وبالتالي، يمكنك الآن الحصول على المعلومات التي تحتاجها بشكل كامل حول عملية الإدراج والتحديث في قاعدة بيانات PostgreSQL الخاصة بك، مما يساعدك في فهم العمليات التي تتم على البيانات وتحديث استراتيجياتك وفقًا لذلك.

المزيد من المعلومات

بالطبع، سأقدم لك المزيد من المعلومات حول كيفية استخدام UPSERT في PostgreSQL 9.5+ بالإضافة إلى تفاصيل حول كيفية الحصول على عدد الصفوف المدرجة والمحدثة وتوضيح ما يحدث في حالة عدم احترام القيد.

أولاً، دعوني أوضح لك الاستعلام السابق بشكل مفصل:

  1. الجزء الأول من الاستعلام يقوم بإدراج الصفوف المحددة في جدول user_logins باستخدام قيم معينة لـ username و logins. إذا كان هناك تضارب في القيود (CONFLICT) بسبب وجود قيمة مكررة في حقل username، فإن ON CONFLICT DO NOTHING يضمن عدم تنفيذ أي عملية إدراج ويتجاهل الصف الذي يتعارض مع القيد.
  2. الجزء الثاني من الاستعلام يقوم بتحديث الصفوف الموجودة بالفعل في جدول user_logins بناءً على القيد الذي تم تحديده (username)، وذلك باستخدام قيمة logins الجديدة المحددة في الأمر EXCLUDED.logins. يتم إرجاع الصفوف التي تم تحديثها باستخدام RETURNING *.
  3. الجزء الأخير من الاستعلام يستخدم SELECT لاسترداد العدد الكلي للصفوف التي تم إدراجها، والصفوف التي تم تحديثها، وعدد الصفوف التي تم تجاوزها بسبب قيود القيد.

الآن، بالنسبة للسؤال حول ما إذا كانت الصفوف المدرجة أو المحدثة ستظل محفوظة في قاعدة البيانات في حالة عدم احترام القيد للصف الأخير، فإن ذلك يعتمد على طريقة تنفيذ الاستعلام. في الحالة التي تم توضيحها في الاستعلام السابق، إذا تم تحديث صفوف معينة بنجاح وثمة صفوف تتعارض مع قيود القيد، فإن الصفوف التي تم تحديثها ستظل محفوظة في الجدول. ومن ثم، فإن الاستعلام يضمن الحفاظ على تغييرات البيانات التي تم تطبيقها بنجاح.

ومن الجدير بالذكر أنه يمكن تخصيص طريقة التعامل مع الصفوف المتعارضة في حالة تحديث أو إدراج. يمكن استخدام كل من DO NOTHING و DO UPDATE للتعامل مع الصفوف المتعارضة بطرق مختلفة وفقاً لاحتياجات التطبيق الخاص بك.

باستخدام هذه المعلومات، يمكنك فهم كيفية استخدام UPSERT في PostgreSQL 9.5+ بشكل أفضل وكيفية الحصول على المعلومات المطلوبة حول الصفوف المدرجة والمحدثة والتعامل مع الصفوف المتعارضة بطريقة فعّالة.

شاهد أيضاً
إغلاق
زر الذهاب إلى الأعلى