صمّم جداولك الخاصة بأنواع مناسبة وقيود NOT NULL وUNIQUE وPRIMARY KEY تحمي بياناتك.
افتح هذا الدرس في Kodokonحتى الآن كنت تستعلم عن جداول جاهزة؛ أما المطوّر المحترف فيصممها. إن المخطّط الجيد يرفض البيانات غير الصالحة عند الإدراج: فهو خط دفاعك الأول، قبل أيّ كود تطبيقي. في sqliteonline.com أو sqlite3، أنشئ هذا الجدول:
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'))
);لا تعرف SQLite سوى خمسة أنواع تخزين: INTEGER وREAL وTEXT وBLOB وNULL. وتُخزَّن التواريخ فيها على شكل TEXT بصيغة ISO (2026-07-04). وفي أماكن أخرى (PostgreSQL وMySQL)، تُصرِّح بدلًا من ذلك بـ VARCHAR(255) أو TIMESTAMP أو BOOLEAN: يبقى المبدأ نفسه، ولا تتغير سوى أسماء الأنواع. اختبر الآن قيودك:
INSERT INTO users (email, username)
VALUES ('alice@example.com', 'alice');
INSERT INTO users (email, username)
VALUES ('alice@example.com', 'alice2');يحدّد المفتاح الأساسي كل صف: لا يكون NULL أبدًا، ولا يتكرر أبدًا، وواحد فقط لكل جدول. وفي SQLite، يتمتع INTEGER PRIMARY KEY بميزة قيّمة: إذ يزداد العمود تلقائيًا عندما تُغفِل قيمته، كما في عمليات الإدراج أعلاه. وفي PostgreSQL تكتب GENERATED ALWAYS AS IDENTITY، وفي MySQL تكتب AUTO_INCREMENT. وأخيرًا، أضف قاعدة عمل باستخدام CHECK:
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);