إنشاء الجداول: CREATE TABLE
نحوّل الكيان إلى جدول حقيقي: أعمدة وأنواع ومفاتيح. ⏱ نحو 25 دقيقة.
- تكتب أمر
CREATE TABLEبأعمدة وأنواع وقيود. - تختار نوع البيانات المناسب، وتعرف مقابله في
MySQL. - تستخدم الترقيم التلقائي والمفتاح المركّب.
- تحذف الجداول وتنشئها بأمان بـ
IF EXISTS.
١شكل الأمر
من المخطط إلى القاعدة: كل كيان يصير جدولًا بأمر CREATE TABLE. نكتب اسم الجدول، ثم بين قوسين كل عمود: اسمه، ونوع بياناته، وقيوده، وبين الأعمدة فواصل:
CREATE TABLE courses ( id INTEGER PRIMARY KEY, code TEXT NOT NULL UNIQUE, title TEXT NOT NULL, hours INTEGER CHECK (hours BETWEEN 1 AND 6)); -- عرض أعمدة الجدول الجديدPRAGMA table_info(courses);
| cid | name | type | notnull | dflt_value | pk |
|---|---|---|---|---|---|
| 0 | id | INTEGER | 0 | NULL | 1 |
| 1 | code | TEXT | 1 | NULL | 0 |
| 2 | title | TEXT | 1 | NULL | 0 |
| 3 | hours | INTEGER | 0 | NULL | 0 |
PRAGMA table_info أمر SQLite يعرض بنية الجدول. ومقابله في MySQL: DESCRIBE courses;
٢أنواع البيانات
نوع البيانات يحدد ما يقبله العمود، وكم مساحة يأخذ، وكيف يُرتَّب ويُقارَن. أهم الأنواع، في SQLite وما يقابلها في MySQL:
| البيانات | SQLite | MySQL | مثال |
|---|---|---|---|
| عدد صحيح | INTEGER | INT، BIGINT | الكمية، سنة الميلاد |
| عدد عشري تقريبي | REAL | FLOAT، DOUBLE | قراءة حساس |
| مبلغ مالي دقيق | NUMERIC | DECIMAL(10,2) | السعر، الراتب |
| نص قصير | TEXT | VARCHAR(100) | الاسم، البريد |
| نص طويل | TEXT | TEXT | وصف المنتج |
| تاريخ | TEXT 'YYYY-MM-DD' | DATE | '2025-05-12' |
| تاريخ ووقت | TEXT | DATETIME | '2025-05-12 14:30:00' |
| نعم/لا | INTEGER (0 أو 1) | BOOLEAN | متوفر؟ |
٣المفتاح الأساسي والترقيم التلقائي
العمود INTEGER PRIMARY KEY في SQLite يرقّم نفسه تلقائيًّا إن لم نعطه قيمة. وفي MySQL نكتب AUTO_INCREMENT:
CREATE TABLE tickets ( id INTEGER PRIMARY KEY, title TEXT NOT NULL);INSERT INTO tickets (title) VALUES ('الطابعة لا تعمل');INSERT INTO tickets (title) VALUES ('نسيت كلمة المرور');SELECT * FROM tickets;
| id | title |
|---|---|
| 1 | الطابعة لا تعمل |
| 2 | نسيت كلمة المرور |
لم نكتب الرقم، فأعطى النظام 1 ثم 2.
-- الجدول نفسه في MySQLCREATE TABLE tickets ( id INT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(200) NOT NULL);
وقد يتكون المفتاح الأساسي من عمودين معًا (مفتاح مركّب)، كما في جدول التسجيل: الطالب نفسه لا يتكرر مع المقرر نفسه، ويُكتب المفتاح في سطر مستقل بعد الأعمدة:
CREATE TABLE attendance ( student_id INTEGER, lecture_no INTEGER, present INTEGER DEFAULT 1, PRIMARY KEY (student_id, lecture_no));INSERT INTO attendance VALUES (1001, 1, 1);INSERT INTO attendance VALUES (1001, 2, 0);INSERT INTO attendance VALUES (1001, 1, 1);
الصف الثالث يكرر الطالب والمحاضرة نفسيهما، فرُفض.
٤حذف الجدول وإنشاؤه بأمان
DROP TABLE يحذف الجدول ببياناته كلها، بلا سؤال ولا سلة محذوفات. والإضافة IF EXISTS و IF NOT EXISTS تمنعان الخطأ إن كان الجدول غير موجود أو موجودًا من قبل:
CREATE TABLE IF NOT EXISTS notes (id INTEGER PRIMARY KEY, body TEXT);CREATE TABLE IF NOT EXISTS notes (id INTEGER PRIMARY KEY, body TEXT); -- لا خطأ DROP TABLE IF EXISTS notes;DROP TABLE IF EXISTS notes; -- لا خطأ SELECT name FROM sqlite_master WHERE type = 'table';
| name |
|---|
| (لا توجد صفوف تحقق الشرط) |
لا توجد جداول بعد الحذف، فالنتيجة فارغة.
توقّع وتحقّق
أنسب نوع للسعر في MySQL:
الترقيم التلقائي في MySQL:
INT PRIMARY KEY.أي اسم عمود أفضل؟
أمر MySQL لعرض بنية الجدول:
DESCRIBE table;الخلاصة
CREATE TABLEاسم ( عمود نوع قيود, … );INTEGERوREALوTEXTفيSQLite، ويقابلهاINTوDECIMALوVARCHARوDATEفيMySQL.INTEGER PRIMARY KEYيرقّم تلقائيًّا، وفيMySQLنضيفAUTO_INCREMENT.- المفتاح المركّب:
PRIMARY KEY (a, b). DROP TABLEيحذف الجدول وبياناته نهائيًّا.
تحدٍّ برمجي: جدول الكتب
متوسطأنشئ جدول كتب لمكتبة الكلية، ثم أضف كتابين وتأكد منهما.
- اسم الجدول
booksبالأعمدة بهذا الترتيب:isbn(نص، مفتاح أساسي)، وtitle(نص إلزامي)، وpub_year(عدد صحيح)، وprice(عدد أكبر من صفر)، وavailable(عدد صحيح افتراضيًّا 1). - أضف كتابين بأي بيانات صحيحة، ثم اعرض الجدول.
👀 اعرض النتيجة المطلوبة
| name |
|---|
| isbn |
| title |
| pub_year |
| price |
| available |
| COUNT(*) |
|---|
| 2 |
| available |
|---|
| 1 |
- الكود يعمل بلا أخطاء
- الأعمدة الخمسة بأسمائها وترتيبها
- في الجدول كتابان
- يرفض كتابًا بلا عنوان
- يرفض ISBN مكررًا
- يرفض سعرًا صفرًا
- الكتاب الجديد متوفر افتراضيًّا
(1)
💡 تلميح 1
💡 تلميح 2
INSERT INTO books (isbn, title, pub_year, price) VALUES ('978-1', 'عنوان', 2024, 50);حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.
CREATE TABLE books ( isbn TEXT PRIMARY KEY, title TEXT NOT NULL, pub_year INTEGER, price REAL CHECK (price > 0), available INTEGER DEFAULT 1); INSERT INTO books (isbn, title, pub_year, price) VALUES ('978-1', 'مقدمة في قواعد البيانات', 2020, 85);INSERT INTO books (isbn, title, pub_year, price) VALUES ('978-2', 'تعلم SQL', 2023, 60); SELECT * FROM books;