في هذا الدرس 6تصفّح المواضيع
لا يقتصر دور العروض في MySQL 8.4 على القراءة فقط؛ بل يمكن للعرض أن يكون قابلاً للتحديث (Updatable View) يقبل أوامر التعديل UPDATE وINSERT وDELETE ويترجمها مباشرةً إلى الجدول الفيزيائي الأصلي. والشرط الهندسي الجوهري لقابلية العرض للتحديث هو وجود تطابق أحادي مباشر (1-to-1 Row Mapping) بين كل صف يظهر في العرض وصف واحد محدد في الجدول الأساسي.
لكي يقبل العرض إدراج صفوف جديدة عبر INSERT، يشترط أيضاً:
- أن يتضمن العرض أسماء أعمدة جدول أساسي بسيطة دون تعبيرات حسابية مثل
price * 1.15. - أن يشمل العرض جميع أعمدة الجدول الأساسي المقيدة بـ
NOT NULLوالتي لا تملك قيمة افتراضيةDEFAULT. - يمكنك التحقق برمجياً من قابلية أي عرض للتحديث عبر استعلام العمود
IS_UPDATABLEفي جدول النظامinformation_schema.VIEWS.
UPDATE v_riyadh_branches SET manager_name = 'Fahad Al-Otaibi' WHERE branch_id = 10;
متى يصبح العرض للقراءة فقط (Read-Only View) ويرفض أوامر التعديل؟ بمجرد أن يحتوي استعلام العرض على أي بنية SQL تدمج عدة صفوف في صف واحد أو تولّد قيماً مشتقة لا يمكن عكسها إلى صف أصلي محدد، يمنع MySQL التحديث ويُطلق الخطأ ERROR 1288 (HY000): The target table of the UPDATE is not updatable.
أبرز الموانع التي تجعل العرض غير قابل للتحديث:
- دوال التجميع والتلخيص: مثل
SUM()وCOUNT()وAVG()وMIN()وMAX(). - عبارات التجميع والتكرار: وجود
DISTINCTأوGROUP BYأوHAVING. - عمليات المجموعات والنوافذ: وجود
UNIONأوUNION ALLأو دوال النوافذOVER (...)أو الاستعلامات الفرعية في بندFROM.
SELECT Table_name, Is_updatable FROM information_schema.VIEWS WHERE ...;
محاكي تحديث العروض وقيد WITH CHECK OPTION
تخيّل عرضاً باسم v_riyadh_branches يحمل الشرط WHERE city = 'Riyadh'. إذا لم تضع قيد حماية على هذا العرض، فبإمكان المستخدم تنفيذ UPDATE v_riyadh_branches SET city = 'Jeddah' WHERE branch_id = 10! سينفذ MySQL التعديل في الجدول الأصلي، لكن المفاجأة أن الصف رقم 10 سيختفي فوراً من العرض (مشكلة الصفوف المتلاشية Vanishing Rows)، بل ويمكن للمستخدم إدراج فرع في مدينة الدمام عبر عرض فروع الرياض!
لإغلاق هذه الثغرة المنطقية، نُلحق العبارة WITH CHECK OPTION في نهاية تعريف العرض؛ فتلزم محرك MySQL بفحص كل عملية INSERT أو UPDATE والتأكد من أن الصف الناتج بعد التعديل لا يزال يحقق شرط WHERE الخاص بالعرض، وإلا يُرفض التعديل بالخطأ ERROR 1369 (HY000): CHECK OPTION failed.
CREATE OR REPLACE VIEW v_riyadh_branches AS ... WITH CHECK OPTION;
يسمح MySQL ببناء عرض فوق عرض آخر (Nested Views). وعند تداخل العروض تبرز أهمية تحديد نطاق الفحص في جملة WITH [CASCADED | LOCAL] CHECK OPTION:
WITH CASCADED CHECK OPTION(الافتراضي): إذا كتبتWITH CHECK OPTIONبدون كلمة إضافية، يعتمد MySQL الوضع المتسلسلCASCADED، فيتحقق من شرطWHEREفي العرض الأعلى بالإضافة إلى شروط جميع العروض الأدنى التي يعتمد عليها حتى لو لم يُكتب فيها قيد فحص.WITH LOCAL CHECK OPTION: يفحص شرطWHEREالخاص بالعرض الحالي فقط، ولا يفحص العروض الأدنى إلا إذا كانت هي نفسها معرّفة بقيد فحص صريح.
CREATE OR REPLACE VIEW v_paid_high_orders AS ... WITH CASCADED CHECK OPTION;
كيف ينفذ محرك MySQL استعلام العرض داخلياً؟ يمكنك التحكم في طريقة المعالجة عبر تحديد الخوارزمية ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE} عند إنشاء العرض:
ALGORITHM = MERGE: يدمج MySQL نص استعلامك الخارجي مع استعلام العرض في جملة واحدة تنفذ مباشرةً على الجدول الأساسي (Query Rewriting). تتميز هذه الخوارزمية بأعلى سرعة وأقل استهلاك للذاكرة، وتسمح بتحديث البيانات عبر العرض.ALGORITHM = TEMPTABLE: ينفذ المحرك استعلام العرض أولاً ويخزن نتائجه في جدول مؤقت داخلي، ثم ينفذ استعلامك الخارجي فوق الجدول المؤقت. تُفرض هذه الخوارزمية تلقائياً عند وجودGROUP BYأوDISTINCTأوUNION، وتجعل العرض غير قابل للتحديث دائماً.ALGORITHM = UNDEFINED(الافتراضي): يترك القرار لمحسّن MySQL، والذي يفضّلMERGEدائماً متى ما سمحت بنية الاستعلام بذلك.
CREATE OR REPLACE ALGORITHM = MERGE VIEW v_fast_active_products AS ...;
يلخّص الجدول المرجعي التالي قواعد قابلية العروض للتحديث في MySQL 8.4، ومقارنة خوارزميات المعالجة، وخيارات فحص الشروط:
| البنية / الخيار | الصيغة في MySQL 8.4 | قابلية التحديث | السلوك الهندسي |
|---|---|---|---|
| عرض بسيط (1-to-1) | ALGORITHM = MERGE | نعم (YES) | يدمج الاستعلام مباشرةً مع الجدول الأساسي |
| عرض تجميعي أو مميز | GROUP BY / DISTINCT / UNION | لا (NO) | يُعالج عبر TEMPTABLE ويرفض التعديل بالخطأ 1288 |
| فحص النطاق المتسلسل | WITH CASCADED CHECK OPTION | نعم (مشروطة) | يفحص شرط العرض الحالي وجميع العروض الأدنى (الافتراضي) |
| فحص النطاق المحلي | WITH LOCAL CHECK OPTION | نعم (مشروطة) | يفحص شرط العرض الحالي والعروض المقيدة صراحةً فقط |
| فحص صلاحية التحديث | information_schema.VIEWS | عمود IS_UPDATABLE | يعرض YES أو NO لكل عرض مسجل |
ملخص الدرس
حصاد الدرسمراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي
ماذا تعلّمت في هذا الدرس؟
أتقنت في هذا الدرس شروط قابلية العرض للتحديث (1-to-1 Mapping)، والموانع التي تجعل العرض للقراءة فقط، وكيفية منع اختفاء الصفوف عبر WITH CHECK OPTION، والفرق بين CASCADED وLOCAL، وخوارزميتي MERGE وTEMPTABLE.
الخطوة التالية والدرس القادم
في الوحدة القادمة ننتقل إلى عالم فهارس الأداء (MySQL Indexes) لنفهم بنية شجرة البحث المتوازنة B+Tree والمفتاح العنقودي وتكلفة الفحص الكامل للجدول.
سجّل الدخول لحفظ تقدمك
تابع إنجاز المواضيع والمصطلحات والمهام، وكمّل من آخر خطوة على أي جهاز.
المصطلحات4
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 Updatable Views تحديث العروض
- تعلّم إدارة العروض القابلة للتحديث وقيد WITH CHECK OPTION في MySQL بأسلوب MySQL 8 الحديث مع أمثلة استعلامات SQL وتطبيقات تفاعلية.
- للمراجعة
- 02 When Is a View Updatable شروط قابلية العرض للتحديث
- المفهوم الهندسي الأساسي وقواعد التنفيذ العملي لقسم شروط قابلية العرض للتحديث في قواعد بيانات MySQL 8.4 الحديثة.
- للمراجعة
- 03 Constructs Blocking View Updates موانع التعديل عبر العرض
- المفهوم الهندسي الأساسي وقواعد التنفيذ العملي لقسم موانع التعديل عبر العرض في قواعد بيانات MySQL 8.4 الحديثة.
- للمراجعة
- 04 Preventing Vanishing Rows CHECK حماية الصفوف بـ CHECK OPTION
- المفهوم الهندسي الأساسي وقواعد التنفيذ العملي لقسم حماية الصفوف بـ CHECK OPTION في قواعد بيانات MySQL 8.4 الحديثة.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
الاختصارات2
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 DML DML
- Data Manipulation Language
- لغة معالجة البيانات (أوامر INSERT وUPDATE وDELETE وSELECT).
- للمراجعة
- 02 MERGE MERGE
- View Query Merge Processing Algorithm
- خوارزمية دمج استعلام العرض مع الاستعلام الخارجي مباشرة على الجدول الأساسي.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
مهامك قبل الاختبار
خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.
-
افتح عميل MySQL 8.4 المحلي ونفّذ استعلام SQL المشروح في قسم شروط قابلية العرض للتحديث للتحقق من النتائج.
-
بدّل بين السيناريوهات الثلاثة في المحاكي التفاعلي ضمن قسم موانع التعديل عبر العرض وقارن مخرجات MySQL 8.4.
تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.
اختبر فهمك.
ووصلها للإتقان.
كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.
أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.
الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.
لمحة عن التحدي4 أسئلة تنتظرك +
ما هو الشرط الهندسي الأساسي لكي يكون العرض الافتراضي قابلاً للتحديث في MySQL؟
اختر الإجابة الأدق وفق قواعد محرك MySQL 8.4.
ماذا يمنع قيد WITH CHECK OPTION عند إدراج أو تحديث الصفوف عبر العرض؟
اختر الإجابة الأدق وفق قواعد محرك MySQL 8.4.
أي بنية برمجية داخل استعلام العرض تجعل العرض غير قابل للتحديث (للقراءة فقط)؟
اختر الإجابة الأدق وفق قواعد محرك MySQL 8.4.
ما هو النطاق الافتراضي الذي يعتمده MySQL عند كتابة WITH CHECK OPTION دون تحديد LOCAL أو CASCADED؟
اختر الإجابة الأدق وفق قواعد محرك MySQL 8.4.