Kodokon kodokon.com

إنشاء مخطّط: CREATE TABLE والقيود

صمّم جداولك الخاصة بأنواع مناسبة وقيود NOT NULL وUNIQUE وPRIMARY KEY تحمي بياناتك.

8 دقيقة · 3 أسئلة

افتح هذا الدرس في Kodokon

حتى الآن كنت تستعلم عن جداول جاهزة؛ أما المطوّر المحترف فيصممها. إن المخطّط الجيد يرفض البيانات غير الصالحة عند الإدراج: فهو خط دفاعك الأول، قبل أيّ كود تطبيقي. في sqliteonline.com أو sqlite3، أنشئ هذا الجدول:

SQL
CREATE TABLE users (
  id INTEGER PRIMARY KEY,
  email TEXT NOT NULL UNIQUE,
  username TEXT NOT NULL UNIQUE,
  created_at TEXT NOT NULL
    DEFAULT (datetime('now'))
);
ثلاثة قيود: NOT NULL وUNIQUE وقيمة افتراضية.

لا تعرف SQLite سوى خمسة أنواع تخزين: INTEGER وREAL وTEXT وBLOB وNULL. وتُخزَّن التواريخ فيها على شكل TEXT بصيغة ISO (2026-07-04). وفي أماكن أخرى (PostgreSQL وMySQL)، تُصرِّح بدلًا من ذلك بـ VARCHAR(255) أو TIMESTAMP أو BOOLEAN: يبقى المبدأ نفسه، ولا تتغير سوى أسماء الأنواع. اختبر الآن قيودك:

SQL
INSERT INTO users (email, username)
VALUES ('alice@example.com', 'alice');

INSERT INTO users (email, username)
VALUES ('alice@example.com', 'alice2');
يفشل الإدراج الثاني: UNIQUE constraint failed.

يحدّد المفتاح الأساسي كل صف: لا يكون NULL أبدًا، ولا يتكرر أبدًا، وواحد فقط لكل جدول. وفي SQLite، يتمتع INTEGER PRIMARY KEY بميزة قيّمة: إذ يزداد العمود تلقائيًا عندما تُغفِل قيمته، كما في عمليات الإدراج أعلاه. وفي PostgreSQL تكتب GENERATED ALWAYS AS IDENTITY، وفي MySQL تكتب AUTO_INCREMENT. وأخيرًا، أضف قاعدة عمل باستخدام CHECK:

SQL
CREATE TABLE products (
  id INTEGER PRIMARY KEY,
  name TEXT NOT NULL,
  sku TEXT NOT NULL UNIQUE,
  price REAL NOT NULL CHECK (price >= 0)
);

INSERT INTO products (name, sku, price)
VALUES ('Keyboard', 'KB-01', -5);
مرفوض: CHECK constraint failed. لن يمرّ أيّ سعر سالب.

اختبار المعرفة

تأكّد من أنك تذكّرت النقاط الأساسية في هذا الدرس.

  1. أيّ قيد يضمن ألّا يظهر أيّ تكرار في العمود email؟
    • NOT NULL
    • UNIQUE
    • CHECK
    • DEFAULT
  2. ما الفرق بين PRIMARY KEY وUNIQUE؟
    • لا فرق، فهما مترادفان
    • يحدّد المفتاح الأساسي الصف: واحد فقط لكل جدول، ولا يكون NULL أبدًا
    • UNIQUE أكثر صرامة من PRIMARY KEY
  3. في SQLite، ماذا يحدث إذا أدرجت صفًا دون قيمة لعمود INTEGER PRIMARY KEY؟
    • يُطلق خطأ NOT NULL
    • تولّد SQLite تلقائيًا عددًا صحيحًا فريدًا
    • يبقى العمود NULL