محتويات الدورة

MariaDB / المتوسط: التزامن وSQL القابلة لإعادة الاستخدام / الدرس 9

العروض والتعبيرات الجدولية المشتركة

جزئ التقارير المعقدة إلى علاقات مسماة، وميز تعريف العرض الدائم عن CTE الخاصة بالعبارة واستدل على انتهاء العودية.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • استخدام العروض وCTE للتعبير عن مراحل التقرير.
  • تقييد العمل العودي وفهم استنتاج الأنواع.

تحسن الأسماء البنية ولا تضمن السرعة

يخزن العرض تعريف استعلام وقد يقدم واجهة مستقرة لجزء من الأعمدة. لا يخزن عادة نسخة مادية محدثة من النتيجة كجدول تقارير مادي. تسمي CTE علاقة لعبارة واحدة فتفصل التصفية والتجميع والعرض. أدخلت MariaDB هذه الميزة في سلسلة 10.2. تظل قرارات الدمج أو التجسيد للمحسن مرتبطة بالشكل والإصدار؛ سهولة القراءة لا تضمن السرعة.

اعرض واجهة مقصودة للعرض

يفترض التعريف جدول bookings تدريبياً بالأعمدة المذكورة. تستخدم SQL SECURITY INVOKER سياق صلاحيات المستدعي للكائنات المرجعية، بينما يستخدم DEFINER نموذجاً مختلفاً يحتاج مراجعة. تثبت MariaDB أعمدة SELECT * عند إنشاء العرض، وتبقى القائمة الصريحة أوضح لمراجعة الواجهة وإعادة الإنشاء لاحقاً. يعرض الاستعلام الحجوزات المدفوعة وحقول العرض فقط؛ تعتمد الصفوف على العينة، ولا يثبت وجود العرض وحده فرض صلاحيات التطبيق.

sql SQL توضيحي؛ النتائج المتوقعة مستنتجة وليست قياسات.
CREATE SQL SECURITY INVOKER VIEW paid_bookings AS
SELECT booking_id, customer_id, total
FROM bookings WHERE state = 'paid';
SELECT booking_id, total FROM paid_bookings
WHERE customer_id = 7 ORDER BY booking_id;

تعريف العرض الدائم من DDL؛ لا تتدرب على إنشائه إلا بعينة معزولة.

جمع عند مستوى موثق

تتيح CTE حساب مجموع لكل عميل ثم تصفيته أو ربطه دون تكرار استعلام طويل. لا يعد الاسم بأن التنفيذ يحدث مرة واحدة؛ افحص الخطة إن كان ذلك مهماً. اجعل أسماء الأعمدة ومستوى الصف واضحة. وفي الترحيل لا يعني دعم WITH في SELECT أن كل صيغة MySQL لربطها بـ UPDATE أو DELETE مدعومة في الإصدار المستخدم.

يجب أن تنتهي CTE العودية

ينشئ الجزء الأساسي الرقم واحد، وتضيف كل خطوة واحداً ما دام السابق أقل من ثلاثة، فالنتيجة 1 و2 و3. استخدمنا UNION ALL عمداً لأن الحد يضمن الانتهاء. تحتاج الهرميات الحقيقية معالجة الدورات وسياسة عمق؛ إضافة عمود عمق قد تجعل الصفوف مختلفة رغم تكرر معرف العقدة. توفر MariaDB حد تكرار وقائياً، لكن بلوغه ليس تصميماً صحيحاً للاجتياز.

sql SQL توضيحي؛ النتائج المتوقعة مستنتجة وليست قياسات.
WITH RECURSIVE days(n) AS (
 SELECT 1
 UNION ALL
 SELECT n + 1 FROM days WHERE n < 3
)
SELECT n FROM days ORDER BY n;
الناتج المتوقع
n
1
2
3

الشرط العودي هو شرط التوقف، ويتحكم ORDER BY في العرض.

راجع الأنواع والاعتماديات

تحدد أعمدة الجزء الأساسي أنواع النتائج العودية، لذا استخدم CAST لسلسلة المسار بحجم يكفي العمق المقصود. كانت إصدارات قديمة تبتر بعض النتائج، وترفض الإصدارات المصححة نمواً غير متوافق؛ اختبر الإصدار وحدود البيانات. وقد يصبح العرض غير صالح بعد تغيير الجدول أو يشير إلى حساب definer مفقود. احصر الاعتماديات وأدرج الملكية وسياق الأمان في مراجعة الترحيل.

الأخطاء الشائعة وإصلاحها

تُستعلم CTE في عبارة لاحقة

لماذا يحدث؟
عومل اسم محلي للعبارة كجدول دائم.
كيف تصلحه؟
كرر تعريف WITH أو استخدم عرضاً دائماً مناسباً.
كيف تتجنب تكراره؟
وثق عمر كل علاقة مسماة.

ERROR 1406: Data too long أثناء العودية

لماذا يحدث؟
تجاوزت القيمة المتنامية النوع المستنتج من الجزء الأساسي.
كيف تصلحه؟
حول الجزء الأساسي إلى نوع محدود كافٍ وتحقق من سلوك الإصدار.
كيف تتجنب تكراره؟
اختبر أقصى عمق وطول لا الأشجار ذات المستوى الواحد فقط.

يبلغ استعلام هرمي max_recursive_iterations

لماذا يحدث؟
استمرت الصفوف بسبب دورات أو غياب شرط التوقف.
كيف تصلحه؟
حدد العمق والدورات صراحة وافحص الرسم.
كيف تتجنب تكراره؟
ضمّن عينة دورية وراجع الحاجة للاحتفاظ بالتكرارات.

اختبر فهمك

1. استخدم CTE لجمع دفعتين اصطناعيتين 10 و15 للعميل 7 ثم اختر المجاميع فوق 20.

اعرض الحل المشروح

تحتوي العلاقة الداخلية دفعتين. ينتج التجميع صفاً للعميل 7 بمجموع 25 ويحتفظ به WHERE النهائي. يفصل ذلك الصفوف عن تصفية الملخص. يمكن أن تعبر HAVING داخل CTE عن الحد نفسه؛ اختر البنية الأوضح للربط والمستوى.

sql حل محلول وفق الافتراضات الاصطناعية المحددة.
WITH totals AS (
 SELECT customer_id, SUM(amount) AS total
 FROM (SELECT 7 AS customer_id, 10 AS amount
       UNION ALL SELECT 7, 15) AS p
 GROUP BY customer_id
) SELECT customer_id, total FROM totals WHERE total > 20;
الناتج المتوقع
customer_id | total
7           | 25

2. يبدأ المسار برمز محطة من محرفين وقد ينمو إلى 200 محرف. ماذا يوضع في الجزء الأساسي؟

اعرض الحل المشروح

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

أهم ما تعلمته

  • يحفظ العرض تعريفاً دائماً وتسمي CTE علاقة محلية للعبارة.
  • تحتاج صحة العودية انتهاءً وأنواعاً كافية معاً.

المراجع الرسمية