AzLearn

CREATE TABLE والأنواع

CREATE TABLE and Types

مفهوم ~17 دقيقة

CREATE TABLE والأنواع

CREATE TABLE يحدد شكل البيانات قبل دخولها. كل عمود يحتاج اسماً ونوعاً وقيداً مناسباً. في SQLite، الأنواع مرنة أكثر من قواعد أخرى، لكن هذا لا يعني أن نكون غامضين. اكتب INTEGER للأعداد، TEXT للنصوص، وخزن المال كعدد صحيح من الهللات.

اختيار النوع قرار مجال. تاريخ الإنشاء يمكن تخزينه كنص ISO في SQLite أو كنوع timestamp في قواعد أخرى. المهم أن يكون القرار موحداً ومفهوماً.

مثال عملي

query.sql

استخدمنا active INTEGER في SQLite لتمثيل boolean عملياً. في قواعد أخرى قد يوجد BOOLEAN.

sqlite_master هو جدول نظام خاص بـSQLite يحتوي كل الكائنات (جداول، فهارس، views). في PostgreSQL وMySQL، المعادل هو information_schema.tables الذي يُعدّ جزءاً من معيار SQL القياسي. استخدم sqlite_master فقط في كود مرتبط بـSQLite صراحة.

INTEGER PRIMARY KEY في SQLite

INTEGER PRIMARY KEY (بدون AUTOINCREMENT) هو اسم مستعار لـrowid في SQLite — أسرع طريقة للإدراج وأقل مساحة.

AUTOINCREMENT يضيف قيداً إضافياً: يضمن ألّا يُعاد استخدام رقم rowid سبق حذفه. هذا يجعل الإدراج أبطأ ويكبّر قاعدة البيانات. استخدمه فقط إذا كنت بحاجة ضرورية لضمان أن المعرفات تزيد دائماً ولا تتكرر أبداً — وهو سيناريو نادر.

في قواعد البيانات الأخرى يختلف الكيورد:

قاعدة البياناتالكيورد
SQLiteINTEGER PRIMARY KEY (rowid alias)
PostgreSQLGENERATED BY DEFAULT AS IDENTITY
MySQL / MariaDBAUTO_INCREMENT
SQL ServerIDENTITY(1,1)

نوع المرونة — Type Affinity

SQLite مرن جداً في الأنواع: INSERT INTO products (price_halalas) VALUES ('banana') ينجح ويخزن نصاً في عمود INTEGER. هذا المرونة قد تُخفي أخطاء.

جداول STRICT (متاحة من SQLite 3.37+) تفرض الأنواع:

CREATE TABLE products (
  id    INTEGER PRIMARY KEY,
  price INTEGER NOT NULL,
  name  TEXT    NOT NULL
) STRICT;

في جدول STRICT، محاولة تخزين نص في عمود INTEGER ترفع خطأ. نوصي باستخدام STRICT في الجداول الجديدة إذا كانت نسخة SQLite تدعمه.

BOOLEAN في SQLite

SQLite لا يملك نوع BOOLEAN حقيقياً. العرف: INTEGER يخزن 0 (خطأ / false) أو 1 (صحيح / true). هذا ما فعلناه مع عمود active أعلاه.

في SQLite قبل الإصدار 3.23 (2018)، لم تكن TRUE/FALSE ككلمات محجوزة مدعومة — كان لزاماً كتابة 1/0 صراحةً، وإلا فإن TRUE يُعامل كاسم عمود. PostgreSQL يدعم WHERE active = TRUE منذ إصداراته الأولى. للأمان عبر إصدارات SQLite القديمة، ابقَ مع WHERE active = 1.

IF NOT EXISTS — إنشاء آمن

CREATE TABLE IF NOT EXISTS يتجاهل الأمر إذا كان الجدول موجوداً بدلاً من رفع خطأ. مفيد في سكريبتات التهيئة التي تُشغَّل عند كل إقلاع:

CREATE TABLE IF NOT EXISTS products (
  id INTEGER PRIMARY KEY,
  name TEXT NOT NULL
);

هذا النمط مدعوم في SQLite وPostgreSQL وMySQL. في SQL Server، الصيغة المقابلة هي IF NOT EXISTS (SELECT ... FROM sys.tables WHERE name='products') CREATE TABLE ....

لا تؤجل القيود

إذا كانت القيمة ضرورية، اكتب NOT NULL. لا تعتمد فقط على التطبيق.

تحدي — Challenge