الدرس 10 من 10

قيود الجدول

هدف الدرس

قواعد تفرضها قاعدة البيانات

01

الشرح

القيود (constraints) قواعد تفرضها قاعدة البيانات بنفسها، فـPRIMARY KEY يجعل لكل صفّ معرّفًا فريدًا، وNOT NULL يمنع ترك القيمة فارغة، وUNIQUE يمنع تكرار القيمة، وCHECK يفرض شرطًا على القيمة، وREFERENCES، وهو المفتاح الأجنبي (foreign key)، يمنع الإشارة إلى صفّ غير موجود.

ولا يكفي أن تتحقّق من البيانات في كود التطبيق وحده، لأنّ سكربت ترحيل (migration) أو خدمة أخرى أو تعديلًا يدويًّا قد يتجاوز هذا التحقّق، أمّا القيد فيرفض أيّ INSERT يخالفه مهما كان مصدره.

وفي SQLite أمر ينساه كثيرون، وهو أنّ المفاتيح الأجنبية لا تُفرض إلا بعد PRAGMA foreign_keys = ON;، وهذا الإعداد يُضبط لكل اتصال على حدة، ومن دونه تقبل SQLite أن تكتب REFERENCES في تعريف الجدول لكنها لا تطبّقه.

02

المطلوب

فعّل المفاتيح الأجنبية، ثم أنشئ جدول بطاقات الهدايا cards بهذه الأعمدة: id مفتاح أساسي، وcustomer_id إلزامي يشير إلى customers(id)، وcode نصّ إلزامي لا يتكرّر، وbalance عدد صحيح إلزامي لا يقلّ عن صفر.

الفحوص

6 فحوص
  1. الجدول cards بأعمدته الأربعة
  2. العمود id مفتاح أساسي
  3. الأعمدة الثلاثة الأخرى إلزامية
  4. الرمز المكرّر يُرفض
  5. الرصيد السالب يُرفض
  6. العميل غير الموجود يُرفض
الجداول المتاحة في هذا الدرس
CREATE TABLE customers (
  id   INTEGER PRIMARY KEY,
  name TEXT NOT NULL,
  city TEXT NOT NULL
);

CREATE TABLE orders (
  id          INTEGER PRIMARY KEY,
  customer_id INTEGER REFERENCES customers(id),
  total       INTEGER NOT NULL,
  placed_on   TEXT    NOT NULL
);

INSERT INTO customers (id, name, city) VALUES
  (1, 'ليان', 'الرياض'),
  (2, 'خالد', 'جدة'),
  (3, 'ريم',  'الدمام'),
  (4, 'فهد',  'الرياض');

INSERT INTO orders (customer_id, total, placed_on) VALUES
  (1, 120, '2026-09-01'),
  (1,  80, '2026-09-12'),
  (2, 300, '2026-09-03'),
  (3,  45, '2026-09-20'),
  (2,  60, '2026-09-25');
03

تلميحات

0/3
query.sql
المخرجاتSQLite (sql.js)

نحمّل بيئة SQLite الآن.

–/6

يبدأ الفحص حين تجهز البيئة.

تجد 6 فحوص في بطاقة «المطلوب».