إضافة بيانات في الجداول باستخدام INSERT
السلام عليكم ورحمة الله وبركاته
المقدمة
بعد أن تعلمنا في المقالات السابقة كيفية إنشاء قواعد البيانات والجداول باستخدام أمر الـ 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