انتقال للمقال

إضافة بيانات في الجداول باستخدام INSERT

السلام عليكم ورحمة الله وبركاته

وقت القراءة: ≈ 10 دقائق

المقدمة

بعد أن تعلمنا في المقالات السابقة كيفية إنشاء قواعد البيانات والجداول باستخدام أمر الـ CREATE وتعرفنا على على بعض الأوامر الأخرى
وتعرفنا على الشروط والقيود المختلفة التي يمكننا وضعها على الجداول باستخدام Constraints
والآن وصلنا للأجزاء الممتعة في عالم الـ SQL وهى كيفية إضافة بيانات الفعلية إلى الجداول الذي أنشأناها

في هذه المقالة سنتعلم كيفية استخدام أمر INSERT INTO لإضافة بيانات إلى الجداول

تجهيز الجدول لإضافة البيانات

قبل أن نبدأ في إضافة البيانات، يجب أن يكون لدينا جدول جاهز لاستقبال هذه البيانات
وهذا ما تعلمناه في المقالات السابقة

حيث قمنا بإنشاء قاعدة بيانات بإسم School عن طريق الأمر:

CREATE DATABASE School;

ثم قمنا بتحديد قاعدة البيانات التي نريد العمل عليها باستخدام:

USE School;

وقلنا أن الـ School هي Schema أو Database تضم مجموعة من الجداول التي تتعلق بمشروع الـ School
ثم قمنا بإنشاء جدول بإسم Students يحتوي على وصف لشكل الجدول والأعمدة التي نريدها والتي ستمثل كل طالب

وجدول الطلاب Students هو ما سنستخدمه لإضافة بيانات الطلاب ونشرح كيفية استخدام أمر INSERT INTO من خلاله فى هذه المقالة

جدول Students الذي سنعمل عليه سيكون بالشكل التالي:

CREATE TABLE Students (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    age INT,
    level VARCHAR(50) DEFAULT 'Beginner',
    email VARCHAR(100) NOT NULL UNIQUE
);

هذا الجدول يحتوي على الأعمدة التالية:

  • id: والذي يمثل الكود المميز أو الرقم التسلس لكل طالب
    وهو من نوع INT
    ولقد جعلناه PRIMARY KEY للجدول لأنه سيمثل الرقم التعريفي المختلف لكل طالب
    ثم قمنا بتحديده كـ AUTO_INCREMENT ليتم توليده تلقائيًا عند إضافة كل طالب جديد دون تدخل يدوي
  • name: والذي يمثل اسم الطالب
    وهو من نوع VARCHAR(100)، مما يعني أنه يمكن أن يحتوي على نص يصل إلى 100 حرف
    ولقد جعلناه NOT NULL أي أنه يجب أن يكون له قيمة ولا يمكن تركه فارغًا
  • age: والذي يمثل عمر الطالب بالطبع
    وهو من نوع INT، مما يعني أنه يمكن أن يحتوي على أعداد صحيحة فقط
  • level: والذي يمثل مستوى الطالب
    وهو من نوع VARCHAR(50)، مما يعني أنه يمكن أن يحتوي على نص يصل إلى 50 حرف
    ولقد جعلناه DEFAULT 'Beginner' أي أنه إذا لم يتم تحديد مستوى الطالب، سيتم تعيينه تلقائيًا إلى Beginner
  • email: والذي يمثل البريد الإلكتروني للطالب
    وهو من نوع VARCHAR(100)، مما يعني أنه يمكن أن يحتوي على نص يصل إلى 100 حرف
    ولقد جعلناه NOT NULL أي أنه يجب أن يكون له قيمة ولا يمكن تركه فارغًا
    ولقد جعلناه UNIQUE أي أنه لا يمكن أن يتكرر في الجدول

الآن لدينا جدول Students جاهز لاستقبال بيانات الطلاب، دعنا نبدأ في إضافة بعض البيانات إليه باستخدام أمر INSERT INTO

إضافة بيانات إلى الجدول باستخدام INSERT INTO

الآن بعد أن قمنا بإنشاء جدول Students، يمكننا إضافة بيانات الطلاب إليه باستخدام أمر INSERT INTO

وهو بسيط فقط تكتب INSERT INTO ثم تحدد اسم الجدول الذي تريد إضافة البيانات إليه

INSERT INTO Students

ثم تبدأ بفتح قوسين ( ) وتحدد الأعمدة التي تريد إضافة البيانات إليها
بشرط أن الأعمدة التي تحددها هنا يجب أن تكون موجودة في الجدول

INSERT INTO Students (name, email, age, level)

لاحظ هنا أننا حددنا الأعمدة name, email, age, level
وهذا يعني أننا سنضيف بيانات لهذه الأعمدة فقط
لم نحدد العمود id لأنه تم تحديده كـ AUTO_INCREMENT، لذا سيتم توليده تلقائيًا
وأيضًا أنتبه أنك لا يمكنك تجاهل الأعمدة التي تم تحديدها كـ NOT NULL دون إعطائها قيمة
لأن الأعمدة التي تم تحديدها كـ NOT NULL يجب أن تحتوي على قيمة عند إضافة بيانات جديدة

بعد ذلك، نكتب VALUES ثم نفتح قوسين آخرين ( ) لنحدد القيم التي نريد إضافتها لكل عمود بترتيب الأعمدة التي حددناها سابقًا

INSERT INTO Students (name, email, age, level)
VALUES ('Ahmed Moustafa', '[email protected]', 20, 'Beginner');

وهكذا لدينا الشكل الكامل لأمر INSERT INTO لإضافة بيانات جديدة إلى جدول Students
ويمكننا تكرار هذا الأمر لإضافة المزيد من الطلاب بنفس الطريقة

لاحظ النقاط المهمة التالية:

أولًا: يجب أن يكون ترتيب وعدد القيم في VALUES مطابق تمامًا لترتيب الأعمدة التي حددناها في قائمة الأعمدة

وهذا يساعد الـ SQL في معرفة أي قيمة تذهب إلى أي العمود
بحيث لو كتبنا INSERT INTO Students (name, email, age, level) فهنا يجب أن تكون القيم التي سنمررها في VALUES بنفس الترتيب 'Ahmed Moustafa', '[email protected]', 20, 'Beginner'

هكذا الـ SQL سيعرف أن:

  • القيمة 'Ahmed Moustafa' خاصة بالـ name
  • القيمة '[email protected]' خاصة بالـ email
  • القيمة 20 خاصة بالـ age
  • القيمة 'Beginner' خاصة بالـ level

إذا غيرنا الترتيب، ستذهب القيم إلى الأعمدة الخاطئة مما يؤدي إلى بيانات غير صحيحة أو أخطاء في قاعدة البيانات
وأيضًا يجب أن يكون عدد القيم المساويًا لعدد الأعمدة المحددة، وهذا بديهي فلا يمكنك أن تحدد عمودين وتضيف ثلاث قيم أو العكس

-- هنا لاحظ أن عدد الأعمدة هو 3 وعدد القيم هو 4
INSERT INTO Students (name, email, level)
VALUES ('Ahmed Moustafa', '[email protected]', 'Beginner', 20);

لقد حددنا 3 أعمدة وهم name, email, level ولكننا أضفنا 4 قيم
بالتالي سيحدث خطأ لأن عدد القيم لا يطابق عدد الأعمدة المحددة

SQL Error: Column count doesn't match value count at row 1

لذا يجب أن تتأكد دائمًا من أن عدد الأعمدة المحددة في INSERT INTO يطابق عدد القيم في VALUES
وهذا أمر سهل وبديهي لذا لا أظن أنه سيكون هناك مشكلة في هذا الأمر بالنسبة لك


لنفترض أننا أضفنا نفس عدد الأعمدة ولكن بترتيب خاطئ

-- هنا لاحظ أن ترتيب القيم لا يطابق ترتيب الأعمدة
INSERT INTO Students (name, email, age, level)
VALUES (20, 'Beginner', 'Ahmed Moustafa', '[email protected]');

بالتالي سنحصل على خطأ لأننا وضعنا القيم في ترتيب خاطئ

SQL Error : Incorrect integer value: 'Ahmed Moustafa' for column 'age' at row 1

هنا سيقول الـ SQL أن القيمة 'Ahmed Moustafa' لا يمكن وضعها في عمود age لأنه يجب أن يكون رقمًا صحيحًا وليس نصًا


لكن سؤال أليس من الأولى أن ينبهنا أنه لا يمكن وضع القيمة 20 في عمود name؟
حسنًا، منطقيًا نعم ولكن هنا الـ SQL سيفترض أن الرقم 20 هو قيمة string بالتالي سيقبلها في عمود name دون مشاكل

بالتالي لو كان الترتيب صحيحًا وكان همت قفيمة عددية نريد وضعها في عمود من نوع varchar، سيقبلها الـ SQL دون مشاكل
وهذا السلوط تقوم به معظم أنظمة الـ DBMS مثل MySQL و PostgreSQL و SQLite وغيرها
لذا يجب أن تكون حذرًا عند تحديد الأعمدة والقيم

على أي حال أمور مثل إضافة رقم في عمود من نوع VARCHAR فهذا يمكننا تجنبه في مرحلة الـ Validation في التطبيق الخاص بنا سواء من ناحية الـ Frontend أو الـ Backend

ثانيًا: يجب أن تتوافق القيم مع نوع البيانات المحددة لكل عمود في الجدول

وهذا بديهي، حيث يجب أن تكون القيم التي نضيفها متوافقة مع نوع البيانات المحددة لكل عمود في الجدول
في جدولنا مثلًا، الأعمدة name و email و level من نوع VARCHAR وهذا يعني أنها تحتوي على نصوص، لذا يجب أن نضع القيم داخل ' '
بينما العمود age من نوع INT وهو للأرقام الصحيحة، لذا يجب أن نكتب الرقم مباشرة بدون '

وبالطبع الـ id لا نحتاج لتحديده في معظم الحالات لأنه يتم توليده تلقائيًا بسبب خاصية AUTO_INCREMENT
ويمكننا تحديده ووضع قيمة له بالمناسبة لكن تأكد من أن القيمة التي تحددها لا تتعارض مع القيم الموجودة بالفعل في الجدول

-- لاحظ هنا نحن نحاول إضافة نص في عمود يقبل أرقام
INSERT INTO Students (name, email, age, level)
VALUES ('Ahmed Moustafa', '[email protected]', 'nineteen', 'Beginner');

هنا كتبنا 'nineteen' في عمود age الذي يجب أن يكون من نوع INT، وهذا غير صحيح
بالتالي سنحصل على خطأ لأننا حاولنا إضافة نص في عمود العمر الذي يجب أن يكون رقمًا صحيحًا

SQL Error: Incorrect integer value: 'nineteen' for column 'age' at row 1

وأحذر أيضًا من إضافة قيم غير منطقية في الأعمدة حتى لو كانت من نفس النوع
مثل إضافة قيمة -5 في عمود الـ age
أو Ahmed Moustafa في عمود الـ email
وهكذا لأن الـ SQL لن يتحقق من منطقية القيم، بل فقط من نوعها

-- ترتيب صحيح وقيم صحيحة من حيث النوع ولكن غير منطقية
INSERT INTO Students (name, email, age, level)
VALUES ('[email protected]', 'Ahmed Moustafa', -5, 'Beginner');

هنا حاولنا إضافة قيمة -5 في عمود age، وهذا غير منطقي لأن العمر لا يمكن أن يكون سالبًا
وأضفنا قيمة email في عمود name والعكس صحيح

هنا الـ SQL لن يتحقق من منطقية القيم، بل فقط من نوعها
وبالتالي لن نحصل على خطأ، وسيتم تخزين البيانات في الجدول
ولكن هذا سيؤدي إلى بيانات غير منطقية في قاعدة البيانات

بالتالي كما قلت الأمور الخاصة بمنطقية القيم يجب أن تتم في مرحلة الـ Validation في التطبيق الخاص بك سواء في الـ Frontend أو الـ Backend


ثالثًا: إذا كان هناك عمود محدد بـ NOT NULL، فيجب أن تعطيه قيمة عند إضافة البيانات

شرط الـ NOT NULL يعني أن هذا العمود لا يمكن أن يكون فارغ أبدًا، وهو مهم للبيانات الأساسية التي يجب أن تكون موجودة دائمًا
في جدولنا، لدينا الـ name و email محددان بـ NOT NULL لأن كل طالب يجب أن يكون له اسم وبريد إلكتروني
إذا حاولنا إضافة بيانات بدون تحديد قيمة لهذين العمودين، ستتوقف عملية الإضافة وسنحصل على رسالة خطأ واضحة

-- مثال خاطئ - لم نحدد قيمة للعمود name المطلوب
INSERT INTO Students (email, age, level)
VALUES ('[email protected]', 20, 'Beginner');

هنا حاولنا إضافة بيانات بدون تحديد قيمة للعمود name الذي هو NOT NULL
بالتالي سنحصل على خطأ لأننا لم نعطي قيمة للعمود المطلوب

SQL Error: Field 'name' doesn't have a default value

والعكس صحيح بحيث أنه لو هناك عمود غير محدد بـ NOT NULL، يمكنك تركه فارغًا أو عدم تحديده في أمر INSERT INTO
وقيمته ستكون NULL أو القيمة الافتراضية المحددة له

مثل age و level في جدولنا، حيث يمكن تركهما فارغين وسيتم تعيينهما إلى NULL أو القيمة الافتراضية المحددة

INSERT INTO Students (name, email)
VALUES ('New Student', '[email protected]');

هنا ستكون قيمة الـ age بـ NULL وقيمة الـ level ستكون Beginner لأنها القيمة الافتراضية المحددة في الجدول

رابعًا: إذا كان هناك عمود محدد بـ UNIQUE، فيجب أن تتأكد من أن القيمة التي تدرجها غير مكررة في الجدول

شرط الـ UNIQUE يضمن عدم وجود قيم متكررة في العمود، وهو مفيد للبيانات التي يجب أن تكون مميزة مثل البريد الإلكتروني أو رقم الهوية
في جدول الـ Students العمود email محدد بـ UNIQUE لأن كل طالب يجب أن يكون له بريد إلكتروني مختلف
إذا حاولنا إضافة بريد إلكتروني موجود بالفعل، ستفشل العملية ونحصل على رسالة خطأ تخبرنا بوجود تكرار

INSERT INTO Students (name, email, age, level)
VALUES ('New Student', '[email protected]', 22, 'Intermediate');

هنا بافتراض أنه لدينا طالب مسجل بالفعل بالبريد الإلكتروني [email protected]
ثم حاولنا إضافة طالب جديد بنفس البريد الإلكتروني
سنحصل على خطأ لأن البريد الإلكتروني مكرر:

SQL Error: Duplicate entry '[email protected]' for key 'students.email'

خامسًا: يمكنك إضافة بيانات دون تحديد أي أعمدة

إذا لم تحدد أي أعمدة في أمر INSERT INTO، سيعتبر الـ SQL أنك تريد إضافة بيانات لكل الأعمدة في الجدول
بنفس الترتيب الذي تم تعريفه في الجدول في أمر الـ CREATE TABLE

INSERT INTO Students
VALUES (1, 'Ahmad Moustafa', 20, 'Beginner', '[email protected]');

هنا لم نحدد الأعمدة، بل أضفنا القيم مباشرة
لكن يجب أن تكون حذرًا لأن هذا يعتمد على ترتيب الأعمدة في الجدول
وبما أننا في أمر الـ CREATE TABLE حددنا الأعمدة بالترتيب التالي: id, name, age, level, email
فبالتالي يجب أن نضيف القيم بنفس الترتيب
ولاحظ أننا في هذه الحالة يجب أن نحدد قيمة لكل عمود في الجدول بما في ذلك الـ id

وبالطبع يمكنك أن تتوقع أن هذا الأسلوب غير مستحسن لأنه:

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

والكثير من الأخطاء الأخرى التي قد تحدث بسبب عدم تحديد الأعمدة بشكل واضح
لذا يُفضل دائمًا تحديد الأعمدة التي تريد إضافة البيانات إليها بشكل صريح في أمر INSERT INTO

سادسًا: يمكنك إضافة أكثر من صف في أمر واحد

يمكنك إضافة أكثر من صف في آن واحد باستخدام نفس أمر INSERT INTO
وذلك لتوفير الوقت وتقليل عدد الأوامر التي تحتاج لكتابتها بالتالي سرعة في الأداء

INSERT INTO Students (name, email, age, level)
VALUES
    ('Ahmed Moustafa', '[email protected]', 20, 'Beginner'),
    ('Osama Ali', '[email protected]', 19, 'Intermediate'),
    ('Mohamed Adel', '[email protected]', 22, 'Advanced'),
    ('Kamal Mahmoud', '[email protected]', 21, 'Beginner');

لاحظ أننا هنا بعد كتابة VALUES، يمكنك كتابة أكثر من صف من البيانات مفصولة بفواصل ,
وبالطبع كل صف يجب أن بداخل قوسين ( ) ويكون بنفس ترتيب الأعمدة التي حددناها في INSERT INTO
ومع مراعاة الشروط التي ذكرناها سابقًا بالطبع

عرض البيانات المضافة

بما أننا تعلمنا كيف نصيف بيانات جديدة إلى جدول الـ Students، دعنا نعرض هذه البيانات لنرى النتيجة
هنا سنستخدم أمر SELECT لعرض البيانات التي أضفناها ونتأكد من أن البيانات تم إضافتها بنجاح

SELECT * FROM Students;

أعرف أننا لم الكثير عن أمر SELECT حتى الآن، ولكن لا تقلق المقالة القادمة ستكون عن SELECT وكيفية استخدامه بشكل مفصل
لكن الآن أريدك أن تعرف أن هذا الأمر سيعرض كل البيانات الموجودة في جدول Students

بالتالي النتيجة ستكون:

+----+-----------------+-----+------------------------+--------------+
| id | name            | age | email                  | level        |
+----+-----------------+-----+------------------------+--------------+
|  1 | Ahmed Moustafa  | 20  | [email protected]   | Beginner     |
|  2 | Osama Ali       | 19  | [email protected]   | Intermediate |
|  3 | Mohamed Adel    | 22  | [email protected] | Advanced     |
|  4 | Kamal Mahmoud   | 21  | [email protected]   | Beginner     |
+----+-----------------+-----+------------------------+--------------+

خاتمة

وهكذا نكون قد تعلمنا كيفية إضافة البيانات إلى الجداول باستخدام أمر INSERT INTO في الـ SQL
تعرفنا على الصيغة الأساسية لهذا الأمر والنقاط المهمة التي يجب مراعاتها عند إضافة البيانات

أهم النقاط التي تعلمناها في هذه المقالة:

  • الصيغة الأساسية لأمر INSERT INTO وكيفية تحديد الأعمدة والقيم
  • أهمية الترتيب بين الأعمدة والقيم وضرورة تطابق العدد والترتيب
  • التوافق مع أنواع البيانات وضرورة التأكد من أن القيم متوافقة مع نوع البيانات المحددة لكل عمود
  • التعامل مع القيود مثل NOT NULL و UNIQUE و AUTO_INCREMENT
  • إضافة عدة صفوف في أمر واحد لتحسين الأداء وسرعة تنفيذ عدة عمليات في وقت واحد
  • عرض البيانات باستخدام أمر SELECT للتأكد من نجاح عملية الإضافة وسنتضيف فيها في المقالة القادمة

الآن بعد أن تعلمنا كيفية إضافة البيانات إلى الجداول، المقالة القادمة ستكون عن أمر SELECT
وكيفية قراءة وعمل Query على البيانات من الجداول بطرق مختلفة ومتقدمة
حيث سنتعلم كيفية تنقية أو تصفية وحصر البيانات وترتيبها وتجميعها وغير ذلك من العمليات المهمة في التعامل مع قواعد البيانات

أتمنى أن تكون هذه المقالة مفيدة لك في فهم كيفية إضافة البيانات باستخدام INSERT INTO في الـ SQL