في هذا الدرس 6تصفّح المواضيع
بدءاً من إصدار MySQL 8.0.16، أصبح محرك InnoDB يطبق قيد التحقق الشرطي CHECK فعلياً بعد أن كانت الإصدارات الأقدم تتجاهله. يفحص قيد CHECK تعبيراً منطقياً على كل صف جديد أو معدَّل، ويرفض العملية فوراً بالخطأ القياسي Error 3819 (HY000): Check constraint is violated إذا كانت نتيجة الشرط FALSE:
- حماية منطق الأعمال داخل القاعدة: يمنع تخزين أسعار سالبة أو نسب خصم تتجاوز 100% أو أعمار غير منطقية حتى لو حدث خطأ في كود الواجهة الخلفية.
- المرونة على مستوى العمود أو الجدول: يمكن كتابته لفحص عمود واحد أو المقارنة بين عدة أعمدة داخل نفس السجل.
CREATE TABLE products (
product_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
title VARCHAR(120) NOT NULL,
unit_price DECIMAL(10, 2) NOT NULL CHECK (unit_price > 0),
discount_pct TINYINT UNSIGNED NOT NULL DEFAULT 0
CHECK (discount_pct <= 80),
PRIMARY KEY (product_id)
);
بدلاً من الاعتماد على الأسماء التلقائية الغامضة مثل products_chk_1، يُنصح دائماً بتعريف قيد التحقق باسم صريح على مستوى الجدول عبر الصيغة CONSTRAINT chk_name CHECK (...) لتظهر رسالة الخطأ واضحة ومحددة عند انتهاك الشرط:
CREATE TABLE employees (
emp_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
full_name VARCHAR(100) NOT NULL,
age TINYINT UNSIGNED NOT NULL,
monthly_salary DECIMAL(10, 2) NOT NULL,
PRIMARY KEY (emp_id),
CONSTRAINT chk_emp_adult CHECK (age >= 18),
CONSTRAINT chk_emp_salary CHECK (monthly_salary >= 3000.00)
);
بينما يقتصر قيد CHECK المكتوب بجوار العمود على فحص ذلك العمود وحده، يتيح قيد CHECK المعرَّف على مستوى الجدول المقارنة بين عدة أعمدة في نفس السجل، مثل ضمان أن سعر التخفيض لا يتجاوز السعر الأصلي، أو أن تاريخ الانتهاء لا يسبق تاريخ البداية:
CREATE TABLE promo_campaigns (
campaign_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
regular_price DECIMAL(10, 2) NOT NULL,
sale_price DECIMAL(10, 2) NOT NULL,
start_date DATE NOT NULL,
end_date DATE NOT NULL,
PRIMARY KEY (campaign_id),
CONSTRAINT chk_sale_le_regular
CHECK (sale_price > 0 AND sale_price <= regular_price),
CONSTRAINT chk_campaign_dates
CHECK (end_date >= start_date)
);
يعتمد SQL منطق التقييم الثلاثي: TRUE وFALSE وUNKNOWN (عند وجود NULL). ولا يرفض قيد CHECK الصف إلا إذا كانت النتيجة FALSE صراحةً؛ أما نتيجة UNKNOWN الناتجة عن NULL فتُقبل! لذلك اجمع دائماً بين NOT NULL وCHECK للأعمدة الإلزامية:
CREATE TABLE course_reviews (
review_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
rating TINYINT UNSIGNED NOT NULL,
bonus_points TINYINT UNSIGNED NULL,
PRIMARY KEY (review_id),
CONSTRAINT chk_rating CHECK (rating >= 1 AND rating <= 5),
CONSTRAINT chk_bonus_cap CHECK (bonus_points <= 10)
);
يمكنك إضافة قيد تحقق جديد إلى جدول قائم عبر الأمر ALTER TABLE ... ADD CONSTRAINT ... CHECK، أو تعطيله وتفعيله مؤقتاً عبر ALTER CHECK ... NOT ENFORCED / ENFORCED، أو حذفه نهائياً عبر DROP CHECK:
ALTER TABLE employees
ADD CONSTRAINT chk_emp_max_age CHECK (age <= 75);
ALTER TABLE employees
ALTER CHECK chk_emp_max_age NOT ENFORCED;
ALTER TABLE employees
DROP CHECK chk_emp_max_age;
يلخص الجدول التالي أنماط قيد التحقق الشرطي CHECK وسلوك التقييم في MySQL 8:
| نمط قيد CHECK | مثال الصياغة | النتيجة عند FALSE | النتيجة عند NULL |
|---|---|---|---|
| فحص عمود إلزامي | price DECIMAL(8,2) NOT NULL CHECK (price > 0) | رفض بالخطأ 3819 | رفض بالخطأ 1048 بسبب NOT NULL |
| فحص عمود اختياري | bonus INT NULL CHECK (bonus <= 100) | رفض بالخطأ 3819 | مقبول لأن UNKNOWN لا يفشل |
| فحص مركّب بين عمودين | CONSTRAINT chk_dates CHECK (end_dt >= start_dt) | رفض بالخطأ 3819 | مقبول إذا كان أحد الطرفين NULL |
ملخص الدرس: تعلمت في هذا الدرس كيف يفرض MySQL 8 قيد التحقق الشرطي CHECK على عمود واحد أو عدة أعمدة، وكيف يتعامل المنطق الثلاثي مع قيم NULL، وكيفية إضافة وتعطيل وحذف شروط التحقق بأمر ALTER TABLE.
الخطوة التالية والدرس القادم: انتقل إلى الدرس الخامس والأخير في وحدة قيود الجداول لإتقان قيد المفتاح الأجنبي FOREIGN KEY وأفعال التكامل المرجعي.
ملخص الدرس
حصاد الدرسمراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي
ماذا تعلّمت في هذا الدرس؟
تضمن قيود CHECK المسماة حماية صحة القيم المنطقية داخل جداول InnoDB مهما تعددت التطبيقات المتصلة بالقاعدة. الخطوة التالية: انتقل إلى درس «قيد المفتاح الأجنبي FOREIGN KEY والتكامل المرجعي».
سجّل الدخول لحفظ تقدمك
تابع إنجاز المواضيع والمصطلحات والمهام، وكمّل من آخر خطوة على أي جهاز.
المصطلحات5
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 CHECK Rule قيد التحقق
- تعلّم قيد التحقق الشرطي CHECK على قيم الصفوف في MySQL بأسلوب MySQL 8 الحديث مع أمثلة استعلامات SQL وتطبيقات تفاعلية.
- للمراجعة
- 02 Enforcing Domain Rules with CHECK فرض الشروط المنطقية بقيد CHECK
- المفهوم الهندسي والصياغة العملية الخاصة بقسم فرض الشروط المنطقية بقيد CHECK في MySQL 8.
- للمراجعة
- 03 Named Table CHECK Constraints تسمية قيود CHECK في الجدول
- المفهوم الهندسي والصياغة العملية الخاصة بقسم تسمية قيود CHECK في الجدول في MySQL 8.
- للمراجعة
- 04 Multi Column Row CHECK Rules فحص عدة أعمدة بقيد CHECK
- المفهوم الهندسي والصياغة العملية الخاصة بقسم فحص عدة أعمدة بقيد CHECK في MySQL 8.
- للمراجعة
- 05 NULL Logic in CHECK Constraints سلوك NULL مع قيد CHECK
- المفهوم الهندسي والصياغة العملية الخاصة بقسم سلوك NULL مع قيد CHECK في MySQL 8.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
الاختصارات4
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 CHK CHK
- Check Constraint Prefix (chk_table_rule)
- البادئة القياسية المتبعة في تسمية قيود التحقق الشرطية داخل جداول MySQL 8.
- للمراجعة
- 02 3VL 3VL
- Three-Valued Logic (TRUE / FALSE / UNKNOWN)
- نظام المنطق الثلاثي في SQL حيث تنتج المقارنات مع NULL القيمة UNKNOWN وليس FALSE.
- للمراجعة
- 03 DDL DDL
- Data Definition Language
- أوامر تعريف بنية الجداول المستخدمة لإضافة أو تفعيل أو حذف قيود CHECK.
- للمراجعة
- 04 LTS LTS
- Long-Term Support Release (MySQL 8.4 LTS)
- إصدار الدعم طويل الأمد من MySQL 8.4 الذي يطبق جميع قيود CHECK بصرامة قياسية.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
مهامك قبل الاختبار
خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.
-
نفّذ أمثلة SQL المشروحة في قسم فرض الشروط المنطقية بقيد CHECK داخل قاعدة بياناتك المحلية وتحقق من النتيجة.
-
بدّل بين الحالات التفاعلية في قسم تسمية قيود CHECK في الجدول وقارن كيف يعالج محرك MySQL 8 كل أمر.
تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.
اختبر فهمك.
ووصلها للإتقان.
كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.
أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.
الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.
لمحة عن التحدي5 أسئلة تنتظرك +
بدءاً من أي إصدار في MySQL أصبح محرك InnoDB يطبق قيود CHECK فعلياً بدلاً من تجاهلها؟
بدأ التنفيذ الفعلي الصارم لقيود CHECK في MySQL منذ الإصدار 8.0.16.
ما رقم الخطأ الذي يُرجعه خادم MySQL 8 عندما يخالف الصف قيد CHECK مفعَّلاً؟
يُرجع الخادم الخطأ القياسي رقم 3819 (Check constraint is violated).
يمكن لقيد CHECK المعرَّف على مستوى الجدول أن يقارن بين عمودين مختلفين في نفس الصف مثل CHECK (sale_price <= regular_price).
صواب؛ تتيح قيود CHECK على مستوى الجدول المقارنة المباشرة بين عدة أعمدة في السجل ذاته.
كيف يتصرف القيد CHECK (bonus_points <= 10) عندما تكون قيمة العمود bonus_points هي NULL؟
تقييم NULL <= 10 يعطي UNKNOWN، وبما أن CHECK يرفض فقط النتيجة FALSE فإن الصف يُقبل.
أي صيغة في أمر ALTER TABLE تحذف قيد التحقق المسمى chk_emp_max_age في MySQL 8؟
تُستخدم صيغة ALTER TABLE ... DROP CHECK لحذف قيد التحقق باسمه.