كيفية إنشاء جدول في SQL: شرح عملي باستخدام PostgreSQL وMySQL

دقائق القراءة: 6

كيفية إنشاء جدول في SQL ولماذا تُعد هذه المهارة أساسية؟

يُعد إنشاء الجداول في SQL من أهم المفاهيم الأساسية في تصميم قواعد البيانات، لأن الجدول هو البنية التي تُخزَّن داخلها البيانات وتُنظَّم على شكل صفوف وأعمدة. وفهم طريقة كتابة أمر CREATE TABLE بشكل صحيح يساعدك على بناء قاعدة بيانات أكثر تنظيمًا، وأسهل في الاستعلام، وأقل عرضة للأخطاء المنطقية لاحقًا.

في هذا الدليل، سنتناول الصياغة الأساسية لأمر CREATE TABLE، ثم ننتقل إلى أمثلة عملية باستخدام كل من PostgreSQL وMySQL، مع شرح أهم أنواع البيانات والقيود التي تُستخدم عند تعريف الأعمدة.

إنشاء الجداول في SQL داخل قواعد بيانات PostgreSQL وMySQL

الصياغة الأساسية لأمر CREATE TABLE في SQL

الصياغة العامة لإنشاء جدول في SQL تبدو كالتالي:

CREATE TABLE table_name(
  column1 data_type column_constraint,
  column2 data_type column_constraint,
  column3 data_type column_constraint,
  column4 data_type column_constraint,
  ... etc
);

تبدأ العبارة بالكلمة المفتاحية CREATE TABLE، ثم تكتب اسم الجدول الذي تريد إنشاءه. على سبيل المثال، إذا أردت إنشاء جدول لتخزين بيانات المعلمين، يمكنك كتابة:

CREATE TABLE teachers();

داخل الأقواس تُعرَّف الأعمدة مع أنواع البيانات والقيود الخاصة بكل عمود. وإذا نسيت كتابة الأقواس، فستحصل على رسالة خطأ لأن الصياغة ستكون غير مكتملة:

CREATE TABLE teachers;

رسالة خطأ عند إنشاء جدول في SQL بدون أقواس

أما الفاصلة المنقوطة ; في نهاية العبارة، فهي تُستخدم للإشارة إلى نهاية أمر SQL، ويُشار إليها أحيانًا باسم statement terminator.

ما هي MySQL storage engines؟

في MySQL، توجد مكونات تُعرف باسم storage engines، وهي المسؤولة عن تنفيذ عمليات التعامل مع الجداول، مثل CRUD، أي:

  • الإنشاء Create
  • القراءة Read
  • التحديث Update
  • الحذف Delete

يمكنك تحديد نوع storage engine الذي سيُستخدم عند إنشاء الجدول. وإذا لم تُحدده صراحة، فغالبًا سيكون المحرك الافتراضي هو InnoDB.

CREATE TABLE table_name(
  column1 data_type column_constraint,
  column2 data_type column_constraint,
  column3 data_type column_constraint,
  column4 data_type column_constraint,
  ... etc
) ENGINE = storage_engine;

هذه الميزة مرتبطة بـ MySQL بشكل أساسي، وهي مهمة عندما تحتاج إلى التحكم في سلوك التخزين، الأداء، أو دعم المعاملات transactions.

ما فائدة IF NOT EXISTS عند إنشاء جدول؟

توجد عبارة اختيارية مفيدة جدًا وهي IF NOT EXISTS، وتُستخدم للتحقق مما إذا كان الجدول موجودًا مسبقًا قبل محاولة إنشائه.

CREATE TABLE IF NOT EXISTS teachers();

إذا كان الجدول موجودًا بالفعل، فلن يتم إنشاء جدول جديد، كما لن تتسبب العبارة عادةً في إيقاف التنفيذ بسبب الخطأ المعتاد الناتج عن التكرار.

لكن إذا تجاهلت IF NOT EXISTS وحاولت إنشاء جدول موجود مسبقًا، فستظهر رسالة خطأ. مثال:

CREATE TABLE IF NOT EXISTS teachers();
CREATE TABLE teachers();

خطأ ناتج عن محاولة إنشاء جدول موجود مسبقًا في SQL

هذا الأسلوب مفيد خصوصًا في ملفات التهيئة وقواعد البيانات التي تُنشر على أكثر من بيئة تشغيل.

كيفية تعريف الأعمدة داخل الجدول

عند إنشاء الجدول، يجب أن تُعرّف الأعمدة داخل الأقواس، مع كتابة:

  • اسم العمود
  • نوع البيانات data type
  • القيد المناسب constraint إن وُجد

في المثال التالي نُضيف أربعة أعمدة إلى جدول teachers:

CREATE TABLE teachers(
  school_id data_type column_constraint,
  name data_type column_constraint,
  email data_type column_constraint,
  age data_type column_constraint
);

يجب الفصل بين تعريفات الأعمدة باستخدام الفواصل. ومن الناحية النظرية، يدعم MySQL عددًا كبيرًا من الأعمدة قد يصل إلى 4096 عمودًا في الجدول الواحد، لكن الحد الفعلي يعتمد على عدة عوامل مثل نوع الجدول والتخزين. أما PostgreSQL فيضع حدًا يقارب 1600 عمود لكل جدول، مع قابلية تأثر هذا الحد بعوامل الأداء والمساحة.

في المشاريع الصغيرة والمتوسطة، نادرًا ما تصل إلى هذه الحدود، لكن معرفتها تبقى مفيدة عند تصميم أنظمة كبيرة.

أنواع البيانات في SQL

عند إنشاء أي عمود، يجب تحديد نوع البيانات الذي سيخزنها. أنواع البيانات تُحدد طبيعة القيم المسموح بها داخل العمود، وتساعد قاعدة البيانات على الفهم الصحيح للبيانات والتحقق منها.

أشهر فئات أنواع البيانات

  • الأنواع الرقمية: int، float، serial، decimal
  • التاريخ والوقت: timestamp، date، time
  • النصوص والمحارف: char، varchar، text
  • Unicode: مثل ntext وnvarchar
  • البيانات الثنائية: مثل binary
  • أنواع أخرى متنوعة: مثل xml وtable

لن نستعرض في هذا المقال جميع الأنواع بالتفصيل، لكننا سنركز على الأكثر استخدامًا في سيناريو إنشاء الجداول الأساسية.

الفرق بين SERIAL وAUTO_INCREMENT

عند الحاجة إلى إنشاء عمود مُعرّف تلقائي للأرقام، تختلف الصياغة بين PostgreSQL وMySQL.

في PostgreSQL

يُستخدم النوع SERIAL لإنشاء عدد صحيح يزداد تلقائيًا بمقدار 1 مع كل صف جديد:

school_id SERIAL

في MySQL

يُستخدم AUTO_INCREMENT مع نوع رقمي مثل INT:

school_id INT AUTO_INCREMENT

إذا أضفت خمسة سجلات إلى الجدول، فستكون قيم العمود school_id عادةً: 1، 2، 3، 4، 5 بشكل تلقائي.

مثال على الزيادة التلقائية للقيم باستخدام SERIAL وAUTO_INCREMENT في SQL

ما هو VARCHAR ولماذا يُستخدم كثيرًا؟

النوع VARCHAR من أكثر أنواع البيانات استخدامًا عند تخزين النصوص القصيرة والمتوسطة، لأنه يتيح لك تحديد حد أقصى لعدد الأحرف مع مرونة في الطول الفعلي للقيمة.

على سبيل المثال، إذا أردت تخزين الاسم والبريد الإلكتروني، يمكنك كتابة:

name VARCHAR(30) column_constraint,
email VARCHAR(30) column_constraint,

الرقم 30 هنا يعني أن الحد الأقصى للنص هو 30 حرفًا. اختيار طول مناسب يُحسن من وضوح التصميم ويعكس طبيعة البيانات المتوقعة.

أهم Column Constraints في SQL

القيود Column Constraints هي قواعد تُفرض على البيانات داخل الأعمدة لضمان صحتها واتساقها. من أشهر هذه القيود:

  • PRIMARY KEY: يحدد معرّفًا فريدًا لكل صف داخل الجدول.
  • FOREIGN KEY: يربط عمودًا بعمود مماثل في جدول آخر للحفاظ على التكامل المرجعي.
  • UNIQUE: يضمن عدم تكرار القيم داخل العمود.
  • NOT NULL: يمنع وجود قيمة فارغة NULL.
  • CHECK: يفرض شرطًا منطقيًا على القيم المدخلة.

استخدام PRIMARY KEY وFOREIGN KEY

إضافة PRIMARY KEY

في جدول teachers، يمكننا جعل العمود school_id هو المفتاح الأساسي.

في PostgreSQL:

school_id SERIAL PRIMARY KEY

في MySQL:

school_id INT AUTO_INCREMENT PRIMARY KEY

وإذا أردت إنشاء PRIMARY KEY مركب من أكثر من عمود، فتتم كتابته بعد تعريف الأعمدة:

CREATE TABLE table_name(
  column1 data_type column_constraint,
  column2 data_type column_constraint,
  column3 data_type column_constraint,
  column4 data_type column_constraint,
  ... etc
  PRIMARY KEY (column1, column2)
);

إضافة FOREIGN KEY لربط الجداول

إذا كان لديك جدول آخر باسم district_employees ويحتوي على مفتاح أساسي باسم district_id، فيمكن تعريفه على النحو التالي في PostgreSQL:

CREATE TABLE district_employees(
  district_id SERIAL PRIMARY KEY,
  employee_name VARCHAR ( 30 ) NOT NULL,
  PRIMARY KEY (district_id)
);

ثم يمكنك ربط جدول teachers بهذا الجدول عبر FOREIGN KEY:

district_id INT REFERENCES district_employees(district_id),
CREATE TABLE teachers(
  school_id SERIAL PRIMARY KEY,
  district_id INT REFERENCES district_employees(district_id),
  column1 data_type column_constraint,
  column2 data_type column_constraint,
  column3 data_type column_constraint,
  column4 data_type column_constraint,
  ... etc
);

هذا الربط مفيد جدًا عند تصميم قواعد بيانات علائقية، لأنه يمنع إدخال قيم لا ترتبط بسجلات فعلية في الجداول الأخرى.

أمثلة على NOT NULL وCHECK وUNIQUE

استخدام NOT NULL

إذا أردت التأكد من أن حقل الاسم لا يُترك فارغًا، فاستخدم القيد NOT NULL:

name VARCHAR(30) NOT NULL

استخدام CHECK

يمكن استخدام CHECK لفرض شرط معين على البيانات. على سبيل المثال، إذا أردت التأكد من أن عمر المعلم لا يقل عن 18 عامًا:

age INT CHECK (age >= 18 )

إذا حاولت إدخال قيمة لا تحقق هذا الشرط، فستظهر رسالة خطأ.

رسالة خطأ عند مخالفة قيد CHECK في جدول SQL

استخدام UNIQUE

لضمان عدم تكرار البريد الإلكتروني بين السجلات، يمكنك استخدام UNIQUE:

email VARCHAR(30) UNIQUE

هذا القيد مناسب جدًا للحقول التي يجب أن تكون فريدة بطبيعتها، مثل البريد الإلكتروني، اسم المستخدم، أو رقم الهوية في بعض الأنظمة.

النتيجة النهائية: إنشاء جدول teachers بشكل احترافي

بعد جمع أنواع البيانات والقيود المناسبة، ستكون البنية النهائية لجدول teachers أكثر وضوحًا وتنظيمًا.

الشكل النهائي لجدول teachers بعد تعريف الأعمدة والقيود في SQL

الصيغة النهائية في PostgreSQL

CREATE TABLE teachers(
  school_id SERIAL PRIMARY KEY,
  name VARCHAR ( 30 ) NOT NULL,
  email VARCHAR ( 30 ) UNIQUE,
  age INT CHECK (age >= 18 )
);

الصيغة النهائية في MySQL

CREATE TABLE teachers(
  school_id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR ( 30 ) NOT NULL,
  email VARCHAR ( 30 ) UNIQUE,
  age INT CHECK (age >= 18 )
);

أفضل ممارسات عند إنشاء الجداول في SQL

  • اختر أسماء جداول وأعمدة واضحة ومعبرة.
  • استخدم أنواع البيانات المناسبة بدلًا من الاعتماد على أنواع عامة بلا حاجة.
  • أضف القيود منذ البداية لتقليل الأخطاء في البيانات.
  • استفد من IF NOT EXISTS عند كتابة سكربتات التهيئة.
  • فكّر في العلاقات بين الجداول مبكرًا لتصميم قاعدة بيانات قابلة للتوسع.
العنصر PostgreSQL MySQL
الزيادة التلقائية SERIAL INT AUTO_INCREMENT
محركات التخزين غير مطبقة بنفس مفهوم MySQL يدعم storage engines مثل InnoDB
التحقق من وجود الجدول IF NOT EXISTS IF NOT EXISTS
تعريف المفتاح الأساسي PRIMARY KEY PRIMARY KEY

الخلاصة التقنية

إتقان أمر CREATE TABLE لا يقتصر على معرفة الصياغة فقط، بل يشمل فهم كيفية اختيار أنواع البيانات الصحيحة، وتطبيق القيود المناسبة، والتمييز بين الفروقات العملية بين PostgreSQL وMySQL. من الناحية التقنية، كلما كان تصميم الجدول محكمًا منذ البداية، أصبحت قاعدة البيانات أكثر استقرارًا وسهولة في التطوير والصيانة مستقبلًا. لذلك، فإن إنشاء الجداول بشكل مدروس هو خطوة أساسية نحو بناء نظام بيانات احترافي وموثوق.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *