طَبِّقْهاتعلّم المبدأ، وطبّقه بيدكمقرر 121 · مبادئ قواعد البيانات
الدرس 19 · الوحدة 8: تحديث وإدخال البيانات

إدخال البيانات: INSERT

نضيف بيانات جديدة صحيحة، صفًّا أو صفوفًا. ⏱ نحو 25 دقيقة.

بعد هذا الدرس ستستطيع أن:
  • تضيف صفًّا بأسماء الأعمدة، وتعرف لماذا تُكتب.
  • تضيف عدة صفوف في أمر واحد.
  • تحصل على رقم الصف الجديد لربطه بجدول آخر.
  • تنسخ صفوفًا بـ INSERT … SELECT وتعالج أخطاء الإدخال.

١إضافة صف

INSERT INTO يضيف صفًّا جديدًا. الطريقة الموصى بها: نكتب أسماء الأعمدة، ثم القيم بالترتيب نفسه:

query.sql
INSERT INTO products (name, category, price, stock)VALUES ('قهوة تركية', 'مشروبات', 30, 25); SELECT * FROM products WHERE name = 'قهوة تركية';
✓ أُضيف صف واحد
النتيجة · صف واحد
idnamecategorypricestock
13قهوة تركيةمشروبات3025

لم نكتب id، فأعطاه النظام الرقم التالي (13). ولو أغفلنا stock لأخذ قيمته الافتراضية 0.

✗ خطأ
query.sql
INSERT INTO productsVALUES ('قهوة تركية', 'مشروبات', 30, 25);
✗ خطأ (السطر 1): الجدول products فيه 5 أعمدة، لكنك أعطيت 4 قيم
✓ صواب
query.sql
INSERT INTO products (name, category, price, stock)VALUES ('قهوة تركية', 'مشروبات', 30, 25);
✓ أُضيف صف واحد

بلا أسماء الأعمدة، يجب أن تعطي قيمة لكل عمود بترتيبه في الجدول (5 أعمدة)، وإن أُضيف عمود لاحقًا تتعطل كل أوامرك القديمة.

٢عدة صفوف في أمر واحد

query.sql
INSERT INTO customers (name, city, phone, joined) VALUES ('أسماء الجهني', 'ينبع',  '0551000011', '2025-06-01'), ('بشير المحمدي', 'العلا', '0551000012', '2025-06-02'), ('جود البقمي',  'الطائف', '0551000013', '2025-06-02'); SELECT id, name, city FROM customers WHERE id > 9;
✓ أُضيف 3 صفوف
النتيجة · 4 صفوف
idnamecity
10لمى العنزيNULL
11أسماء الجهنيينبع
12بشير المحمديالعلا
13جود البقميالطائف

أسرع من ثلاثة أوامر منفصلة، ويُنفَّذ كله أو يُرفض كله.

٣رقم الصف الجديد

بعد إضافة عميل نحتاج رقمه لنضيف له طلبًا. last_insert_rowid() في SQLite، و LAST_INSERT_ID() في MySQL:

query.sql
INSERT INTO customers (name, city) VALUES ('رهف الثبيتي', 'الطائف');INSERT INTO orders (customer_id, order_date) VALUES (last_insert_rowid(), '2025-06-05'); SELECT o.id, c.name, o.order_date, o.statusFROM orders o JOIN customers c ON c.id = o.customer_idWHERE o.id = (SELECT MAX(id) FROM orders);
✓ أُضيف صف واحد
✓ أُضيف صف واحد
النتيجة · صف واحد
idnameorder_datestatus
13رهف الثبيتي2025-06-05جديد

لاحظ: حالة الطلب صارت «جديد» تلقائيًّا من DEFAULT 'جديد'.

٤النسخ من جدول إلى آخر: INSERT … SELECT

بدل VALUES نضع استعلامًا، فتُضاف نتيجته كلها. مثال: أرشفة الطلبات المسلّمة:

query.sql
CREATE TABLE archived_orders (  id INTEGER PRIMARY KEY, customer_id INTEGER, order_date TEXT); INSERT INTO archived_orders (id, customer_id, order_date)SELECT id, customer_id, order_dateFROM ordersWHERE status = 'مُسلَّم'; SELECT COUNT(*) AS archived FROM archived_orders;
النتيجة · صف واحد
archived
5

٥الأخطاء الشائعة عند الإدخال

query.sql
INSERT INTO products (name, category, price) VALUES ('بخور', 'أدوات');
✗ خطأ (السطر 1): عدد القيم (2) لا يساوي عدد الأعمدة (3)
query.sql
INSERT INTO customers (name, phone) VALUES ('ضيف', '0551000001');
✗ خطأ (السطر 1): مخالفة قيد UNIQUE: القيمة مكررة في customers.phone

الجوال مسجل لسعود، والعمود UNIQUE.

وعلامة التنصيص المفردة داخل النص تُكتب مرتين:

query.sql
INSERT INTO products (name, category, price)VALUES ('Children''s Tea', 'مشروبات', 15); SELECT name FROM products WHERE price = 15;
النتيجة · صف واحد
name
Children's Tea

توقّع وتحقّق

الطريقة الموصى بها للإدخال:

بأسماء الأعمدة.

رقم آخر صف أُضيف في MySQL:

وفي SQLite last_insert_rowid().

كيف نكتب it's داخل نص SQL؟

مضاعفة العلامة.

إضافة نتيجة استعلام كاملة:

بلا VALUES.

الخلاصة

تحدٍّ برمجي: عميلة جديدة وطلبها الأول

متوسط

سجّلت عميلة جديدة وطلبت مباشرة. أضفها، ثم أضف طلبها وصنفيه.

المطلوب:
  • العميلة: الاسم «أسماء الجهني»، المدينة «ينبع»، الجوال 0551000011، الانضمام 2025-06-01.
  • طلب لها بتاريخ 2025-06-01.
  • في الطلب صنفان: قهوة عربية (رقم 1) قطعتان بسعر 35، وهيل (رقم 9) قطعة بسعر 28.
👀 اعرض النتيجة المطلوبة
بعد التنفيذ: SELECT name, city, joined FROM customers WHERE phone = '0551000011'
namecityjoined
أسماء الجهنيينبع2025-06-01
بعد التنفيذ: SELECT o.order_date, o.status FROM orders o JOIN customers c ON c.id = o.customer_id WHERE c.phone = '0551000011'
order_datestatus
2025-06-01جديد
بعد التنفيذ: SELECT i.product_id, i.qty, i.price FROM order_items i JOIN orders o ON o.id = i.order_id JOIN customers c ON c.id = o.customer_id WHERE c.phone = '0551000011' ORDER BY i.product_id
product_idqtyprice
1235
9128
بعد التنفيذ: SELECT COUNT(*) FROM orders
COUNT(*)
13
✓ التحقق الآلي من حلّك:
  • الكود يعمل بلا أخطاء
  • العميلة مسجلة ببياناتها
  • لها طلب واحد بالتاريخ الصحيح
  • في الطلب الصنفان الصحيحان
  • لم تتغير بقية الطلبات

💡 تلميح 1
رقم العميلة الجديد 11، ورقم طلبها 13. يمكن كتابتهما مباشرة، أو استخدام last_insert_rowid().
💡 تلميح 2
انتبه: بعد إدخال الصنف الأول يتغير last_insert_rowid()، فأدخل الصنفين في أمر واحد، أو اكتب رقم الطلب 13 صراحة.

حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.

solution.sql
INSERT INTO customers (name, city, phone, joined)VALUES ('أسماء الجهني', 'ينبع', '0551000011', '2025-06-01'); INSERT INTO orders (customer_id, order_date)VALUES (last_insert_rowid(), '2025-06-01'); INSERT INTO order_items (order_id, product_id, qty, price) VALUES ((SELECT MAX(id) FROM orders), 1, 2, 35), ((SELECT MAX(id) FROM orders), 9, 1, 28);
انتقل إلى تقييم الدرساختيار من متعدد، وصح وخطأ، وأكمل الفراغ، وتتبّع الناتج.ابدأ التقييم ←

📝 معلم؟ أرسل ملاحظة للمؤلف عن هذا الدرس