AzLearn

INSERT

INSERT

مفهوم ~16 دقيقة

INSERT

INSERT يضيف صفوفاً جديدة. اكتب أسماء الأعمدة صراحة بدلاً من الاعتماد على ترتيب الجدول. الصيغة INSERT INTO products (name, price_halalas) VALUES (...) أوضح وأأمن من إدخال قيم بلا أسماء. إذا تغير ترتيب الأعمدة أو أضيف عمود جديد، يبقى الاستعلام مفهوماً.

يمكن إدخال صف واحد أو عدة صفوف. في التطبيقات، غالباً تستخدم parameters لا نصوصاً مركبة، حتى تمنع SQL injection وتحافظ على الأنواع.

مثال عملي

query.sql

الأعمدة مسماة بوضوح، والقيم تطابقها بالترتيب.

لا تعتمد على defaults غير واضحة

إذا كان العمود مهمّاً، مرر قيمته أو عرّف default واضحاً في schema. لا تجعل البيانات ناقصة ثم تصلحها لاحقاً.

UPSERT — أدخل أو حدّث

أحياناً لا تعرف مسبقاً إن كان الصف موجوداً أم لا: إذا وُجد حدّثه، وإلا أدخله. هذا ما يُسمى UPSERT.

في SQLite (3.24+) وPostgreSQL:

-- حدّث إذا وُجد تعارض في sku، وإلا أدخل
INSERT INTO products (sku, name, price_halalas)
VALUES ('AZL-001', 'كتاب', 5000)
ON CONFLICT (sku) DO UPDATE SET
  name          = excluded.name,
  price_halalas = excluded.price_halalas;

-- أو تجاهل التعارض تماماً
INSERT INTO products (sku, name)
VALUES ('AZL-001', 'كتاب')
ON CONFLICT (sku) DO NOTHING;

excluded اسم مستعار للصف الذي كنت ستدخله — يُستخدم في الجزء DO UPDATE للوصول إلى القيم الجديدة.

في MySQL، الصيغة مختلفة:

INSERT INTO products (sku, name)
VALUES ('AZL-001', 'كتاب')
ON DUPLICATE KEY UPDATE name = VALUES(name);

RETURNING — اعرف ما غيّرته

SQLite (3.35+) وPostgreSQL يدعمان RETURNING للحصول على بيانات الصف المُدرج فوراً:

INSERT INTO products (name, price_halalas)
VALUES ('Book', 2500)
RETURNING id, name;

يفيد هذا لمعرفة الـid المُولّد بدون استعلام إضافي. MySQL لا يدعم RETURNING — يستخدم LAST_INSERT_ID() بدلاً منه.

تحدي — Challenge