شبكة تعلم مع ناو

لماذا قد يسمح CHECK بقيمة NULL رغم وجود شرط رقمي؟

لا يرفض CHECK الصف إلا عندما تكون نتيجة شرطه FALSE. إذا كانت النتيجة TRUE أو UNKNOWN، فلا يعد الشرط منتهكًا. تظهر النتيجة غير المعروفة عند إجراء مقارنات كثيرة مع NULL، لأن القيمة المفقودة لا يمكن الحكم عليها كعدد موجب أو سالب.

في MySQL 8.0.16 أو أحدث، يعني ذلك أن شرطًا مثل CHECK (price > 0) لا يجعل السعر مطلوبًا تلقائيًا. فهو يرفض الصفر والأعداد السالبة، لكنه يسمح بـNULL إذا كان تعريف العمود يسمح بها. لهذا يجب فصل شرط وجود القيمة عن شرط صلاحيتها العددية عند تصميم الجدول.

مثال

CREATE TABLE books (
  id INT PRIMARY KEY,
  price DECIMAL(8,2),
  CONSTRAINT chk_books_price CHECK (price > 0)
);
INSERT INTO books VALUES (1, NULL);

ينجح الإدخال في المثال. إذا كان السعر إلزاميًا وموجبًا، نضيف NOT NULL إلى العمود مع الاحتفاظ بقيد المقارنة، لأن كل قيد يؤدي وظيفة مستقلة.

باختصار: يرفض CHECK النتيجة الخاطئة فقط؛ استخدم NOT NULL عندما تريد منع القيمة المفقودة أيضًا.

هل تريد تعلّم SQL خطوة بخطوة مع تمارين عملية؟ تابع مسار SQL من الأساسيات للاحتراف.

اختبر نفسك

خمسة أسئلة سريعة، مع الإجابة والشرح بعد كل سؤال.