انتقل إلى محتوى الدرس
الدرس 19
دورة MySQL

قيد التحقق الشرطي CHECK على قيم الصفوف في MySQLMySQL CHECK Constraint

تعلّم قيد التحقق الشرطي CHECK على قيم الصفوف في MySQL بأسلوب MySQL 8 الحديث مع أمثلة استعلامات SQL وتطبيقات تفاعلية.
أقسام الدرس
6
الأمثلة
5
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
7
محتوى الدرس
في هذا الدرس 6تصفّح المواضيع

بدءاً من إصدار MySQL 8.0.16، أصبح محرك InnoDB يطبق قيد التحقق الشرطي CHECK فعلياً بعد أن كانت الإصدارات الأقدم تتجاهله. يفحص قيد CHECK تعبيراً منطقياً على كل صف جديد أو معدَّل، ويرفض العملية فوراً بالخطأ القياسي Error 3819 (HY000): Check constraint is violated إذا كانت نتيجة الشرط FALSE:

  • حماية منطق الأعمال داخل القاعدة: يمنع تخزين أسعار سالبة أو نسب خصم تتجاوز 100% أو أعمار غير منطقية حتى لو حدث خطأ في كود الواجهة الخلفية.
  • المرونة على مستوى العمود أو الجدول: يمكن كتابته لفحص عمود واحد أو المقارنة بين عدة أعمدة داخل نفس السجل.
مخطط يوضح قيد التحقق الشرطي CHECK على العمود والمقارنة بين عمودين ومنطق التقييم الثلاثي مع NULL في MySQL 8
SQL
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 (...) لتظهر رسالة الخطأ واضحة ومحددة عند انتهاك الشرط:

SQL
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 المعرَّف على مستوى الجدول المقارنة بين عدة أعمدة في نفس السجل، مثل ضمان أن سعر التخفيض لا يتجاوز السعر الأصلي، أو أن تاريخ الانتهاء لا يسبق تاريخ البداية:

SQL
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 للأعمدة الإلزامية:

SQL
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:

SQL
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

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 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

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 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 بصرامة قياسية.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

من الفهم للتطبيق

مهامك قبل الاختبار

خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.

0/2مهام منجزة
  1. نفّذ أمثلة SQL المشروحة في قسم فرض الشروط المنطقية بقيد CHECK داخل قاعدة بياناتك المحلية وتحقق من النتيجة.

  2. بدّل بين الحالات التفاعلية في قسم تسمية قيود CHECK في الجدول وقارن كيف يعالج محرك MySQL 8 كل أمر.

تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.

مساحة التحدي

اختبر فهمك.
ووصلها للإتقان.

كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.

5أسئلة 2أنواع تحديات 100%هدف الإتقان
تصحيح تلقائي. فرص بلا حدود.

أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.

الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.

لمحة عن التحدي5 أسئلة تنتظرك
01

بدءاً من أي إصدار في MySQL أصبح محرك InnoDB يطبق قيود CHECK فعلياً بدلاً من تجاهلها؟

بدأ التنفيذ الفعلي الصارم لقيود CHECK في MySQL منذ الإصدار 8.0.16.

02

ما رقم الخطأ الذي يُرجعه خادم MySQL 8 عندما يخالف الصف قيد CHECK مفعَّلاً؟

يُرجع الخادم الخطأ القياسي رقم 3819 (Check constraint is violated).

03

يمكن لقيد CHECK المعرَّف على مستوى الجدول أن يقارن بين عمودين مختلفين في نفس الصف مثل CHECK (sale_price <= regular_price).

صواب؛ تتيح قيود CHECK على مستوى الجدول المقارنة المباشرة بين عدة أعمدة في السجل ذاته.

04

كيف يتصرف القيد CHECK (bonus_points <= 10) عندما تكون قيمة العمود bonus_points هي NULL؟

تقييم NULL <= 10 يعطي UNKNOWN، وبما أن CHECK يرفض فقط النتيجة FALSE فإن الصف يُقبل.

05

أي صيغة في أمر ALTER TABLE تحذف قيد التحقق المسمى chk_emp_max_age في MySQL 8؟

تُستخدم صيغة ALTER TABLE ... DROP CHECK لحذف قيد التحقق باسمه.