CREATE TABLE والأنواع
CREATE TABLE and Types
CREATE TABLE والأنواع
CREATE TABLE يحدد شكل البيانات قبل دخولها. كل عمود يحتاج اسماً ونوعاً وقيداً مناسباً. في SQLite، الأنواع مرنة أكثر من قواعد أخرى، لكن هذا لا يعني أن نكون غامضين. اكتب INTEGER للأعداد، TEXT للنصوص، وخزن المال كعدد صحيح من الهللات.
اختيار النوع قرار مجال. تاريخ الإنشاء يمكن تخزينه كنص ISO في SQLite أو كنوع timestamp في قواعد أخرى. المهم أن يكون القرار موحداً ومفهوماً.
مثال عملي
استخدمنا 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 سبق حذفه. هذا يجعل الإدراج أبطأ ويكبّر قاعدة البيانات. استخدمه فقط إذا كنت بحاجة ضرورية لضمان أن المعرفات تزيد دائماً ولا تتكرر أبداً — وهو سيناريو نادر.
في قواعد البيانات الأخرى يختلف الكيورد:
| قاعدة البيانات | الكيورد |
|---|---|
| SQLite | INTEGER PRIMARY KEY (rowid alias) |
| PostgreSQL | GENERATED BY DEFAULT AS IDENTITY |
| MySQL / MariaDB | AUTO_INCREMENT |
| SQL Server | IDENTITY(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. لا تعتمد فقط على التطبيق.