إدراج (SQL)
تضيف عبارة SQL INSERT سجلاً واحداً أو أكثر إلى أي جدول واحد في قاعدة بيانات علائقية .
النموذج الأساسي
تأخذ عبارات الإدراج الشكل التالي:
INSERT INTO table ( column1 [, column2 , column3 ... ]) VALUES ( value1 [, value2 , value3 ... ])
يجب أن يتساوى عدد الأعمدة مع عدد القيم. في حال عدم تحديد عمود، تُستخدم قيمته الافتراضية. يجب أن تستوفي القيم المحددة (أو الضمنية) في عبارة INSERT جميع القيود المطبقة (مثل المفاتيح الأساسية ، وقيود التحقق ، وقيود عدم السماح بقيم فارغة). في حال حدوث خطأ في بناء الجملة أو انتهاك أي من القيود، لا يُضاف الصف الجديد إلى الجدول، ويُعاد خطأ بدلاً من ذلك.
مثال:
INSERT INTO phone_book ( name , number ) VALUES ( 'John Doe' , '555-1212' );يمكن أيضًا استخدام الاختصارات، مع الاستفادة من ترتيب الأعمدة عند إنشاء الجدول. ليس من الضروري تحديد جميع الأعمدة في الجدول، حيث ستأخذ أي أعمدة أخرى قيمتها الافتراضية أو ستبقى فارغة .
INSERT INTO table VALUES ( value1 , [ value2 , ... ])
مثال لإدخال البيانات في عمودين في جدول phone_book وتجاهل أي أعمدة أخرى قد تأتي بعد أول عمودين في الجدول.
INSERT INTO phone_book VALUES ( 'John Doe' , '555-1212' );نماذج متقدمة
إدراجات متعددة الصفوف
إحدى ميزات لغة SQL (منذ SQL-92 ) هي استخدام مُنشئات قيمة الصف لإدراج صفوف متعددة في وقت واحد في عبارة SQL واحدة:
أدخل في جدول tablename ( العمود أ ، [ العمود ب ، ...]) القيم التالية: ( ' value -1a' ، [ 'value-1b' ، ...])، ( 'value-2a' ، [ 'value-2b' ، ...])، ...هذه الميزة مدعومة من قبل IBM Db2 و SQL Server (منذ الإصدار 10.0 - أي 2008) و PostgreSQL (منذ الإصدار 8.2) و MySQL و SQLite (منذ الإصدار 3.7.11) و H2 .
مثال (بافتراض أن "الاسم" و"الرقم" هما العمودان الوحيدان في جدول "دفتر_الهواتف"):
INSERT INTO phone_book VALUES ( 'John Doe' , '555-1212' ), ( 'Peter Doe' , '555-2323' );والتي يمكن اعتبارها اختصارًا للبيانين
أضف إلى جدول phone_book القيم التالية : ( 'John Doe' , '555-1212' )؛ أضف إلى جدول phone_book القيم التالية: ( 'Peter Doe' , '555-2323' ).لاحظ أن العبارتين المنفصلتين قد يكون لهما دلالات مختلفة (خاصة فيما يتعلق بمحفزات العبارة ) وقد لا توفران نفس الأداء الذي توفره عملية إدراج متعددة الصفوف.
لإدراج عدة صفوف في MS SQL، يمكنك استخدام هذا التركيب:
INSERT INTO phone_book SELECT 'John Doe' , '555-1212' UNION ALL SELECT 'Peter Doe' , '555-2323' ;لاحظ أن هذا ليس بيان SQL صالحًا وفقًا لمعيار SQL ( SQL:2003 ) بسبب عبارة التحديد الفرعي غير المكتملة.
للقيام بنفس الشيء في أوراكل، استخدم جدول DUAL ، الذي يتكون دائمًا من صف واحد فقط:
أَدْخِلْ فِي جَدْوَلِ `phone_book` الْخَطْرَى 'John Doe' , '555-1212' مِنْ جَدْوَلِ DUAL وَاحِدًا كُلَّهِ، وَخَطْرَى 'Peter Doe' , '555-2323' مِنْ جَدْوَلِ DUALيُظهر تطبيق هذا المنطق المتوافق مع المعايير المثال التالي، أو كما هو موضح أعلاه:
أَدْخِلْ فِي جَدْوَلِ phone_book الْخَطَّةَ 'John Doe' و'555-1212 ' مِنْ جَدْوَلِ LATERAL ( الْقِيَمُ ( 1 ) ) كـ t ( c ) وَاحِدًا كُلَّهِ الْخَطَّةَ 'Peter Doe' و'555-2323 ' مِنْ جَدْوَلِ LATERAL ( الْقِيَمُ ( 1 ) ) كـ t ( c )يدعم Oracle PL/SQL عبارة INSERT ALL ، حيث يتم إنهاء عبارات الإدراج المتعددة بواسطة SELECT : [ 1 ]
INSERT ALL INTO phone_book VALUES ( 'John Doe' , '555-1212' ) INTO phone_book VALUES ( 'Peter Doe' , '555-2323' ) SELECT * FROM DUAL ;في برنامج فايربيرد ، يمكن إدراج عدة صفوف على النحو التالي:
INSERT INTO phone_book ( name , number ) SELECT 'John Doe' , '555-1212' FROM RDB$DATABASE UNION ALL SELECT 'Peter Doe' , '555-2323' FROM RDB$DATABASE ;ومع ذلك، فإن Firebird يقيد عدد الصفوف التي يمكن إدراجها بهذه الطريقة، نظرًا لوجود حد لعدد السياقات التي يمكن استخدامها في استعلام واحد.
نسخ الصفوف من جداول أخرى
يمكن استخدام عبارة INSERT لاسترجاع البيانات من جداول أخرى، وتعديلها عند الضرورة، ثم إدراجها مباشرةً في الجدول. يتم كل ذلك في عبارة SQL واحدة لا تتطلب أي معالجة وسيطة في تطبيق العميل. يُستخدم استعلام فرعي بدلاً من عبارة VALUES . يمكن أن يحتوي الاستعلام الفرعي على عمليات ربط، واستدعاءات دوال، بل ويمكنه الاستعلام عن نفس الجدول الذي تُدرج فيه البيانات. منطقيًا، يتم تقييم الاستعلام الفرعي قبل بدء عملية الإدراج الفعلية. مثال على ذلك موضح أدناه.
INSERT INTO phone_book2 SELECT * FROM phone_book WHERE name IN ( 'John Doe' , 'Peter Doe' )يلزم إجراء تعديل عندما يتم إدخال بعض البيانات من جدول المصدر في الجدول الجديد، ولكن ليس السجل بأكمله. (أو عندما لا تكون مخططات الجداول متطابقة).
INSERT INTO phone_book2 ( name , number ) SELECT name , number FROM phone_book WHERE name IN ( 'John Doe' , 'Peter Doe' )ينتج عن عبارة SELECT جدول (مؤقت)، ويجب أن يتطابق مخطط هذا الجدول المؤقت مع مخطط الجدول الذي يتم إدخال البيانات فيه.
القيم الافتراضية
من الممكن إدراج صف جديد دون تحديد أي بيانات، باستخدام القيم الافتراضية لجميع الأعمدة. مع ذلك، ترفض بعض قواعد البيانات هذا الأمر في حال عدم تحديد أي بيانات، مثل Microsoft SQL Server، وفي هذه الحالة يمكن استخدام الكلمة المفتاحية DEFAULT .
INSERT INTO phone_book VALUES ( DEFAULT )تدعم قواعد البيانات أحيانًا صيغًا بديلة لهذا الغرض؛ على سبيل المثال، يسمح MySQL بحذف الكلمة المفتاحية DEFAULT ، ويمكن لـ T-SQL استخدام DEFAULT VALUES بدلًا من VALUES(DEFAULT) . كما يمكن استخدام الكلمة المفتاحية DEFAULT في الإدخال العادي لملء عمود باستخدام قيمته الافتراضية.
INSERT INTO phone_book VALUES ( DEFAULT , '555-1212' )يختلف ما يحدث عندما لا يُحدد عمودٌ ما قيمةً افتراضيةً باختلاف قاعدة البيانات. على سبيل المثال، ستملأ قواعد بيانات MySQL وSQLite العمود بقيمة فارغة (باستثناء الوضع الصارم)، بينما سترفض العديد من قواعد البيانات الأخرى هذا البيان.
استعادة المفتاح
قد يواجه مصممو قواعد البيانات الذين يستخدمون مفتاحًا بديلًا كمفتاح أساسي لكل جدول، حالاتٍ تتطلب منهم أحيانًا استرداد المفتاح الأساسي المُولّد تلقائيًا من قاعدة البيانات من عبارة SQL INSERT لاستخدامه في عبارات SQL أخرى. لا تسمح معظم الأنظمة لعبارات SQL INSERT بإرجاع بيانات الصفوف. لذا، يصبح من الضروري إيجاد حل بديل في مثل هذه الحالات. ومن الحلول الشائعة:
- يتم استخدام إجراء مخزن خاص بقاعدة البيانات لإنشاء المفتاح البديل، ثم تنفيذ عملية الإدراج ، وأخيرًا إرجاع المفتاح المُنشأ. على سبيل المثال، في Microsoft SQL Server، يتم استرداد المفتاح عبر الدالة الخاصة SCOPE_IDENTITY() ، بينما في SQLite تُسمى الدالة last_insert_rowid() .
- استخدام عبارة SELECT خاصة بقاعدة البيانات على جدول مؤقت يحتوي على آخر صف (صفوف) تم إدراجها. تُنفذ Db2 هذه الميزة بالطريقة التالية:
حدد * من جدول جديد ( أدخل في جدول phone_book القيم ( 'Peter Doe' ، '555-2323' ) ) كـ t
- يقوم Db2 لنظام التشغيل z/OS بتنفيذ هذه الميزة بالطريقة التالية.
حدد رقم الموظف ، ونوع التوظيف ، وتاريخ التوظيف من الجدول النهائي ( أدخل في جدول الموظفين ( الاسم ، الراتب ، رقم القسم ، المستوى ) القيم ( 'ماري سميث' ، 35000.00 ، 11 ، ' مساعد' ) );
- استخدام عبارة SELECT بعد عبارة INSERT مع دالة خاصة بقاعدة البيانات تُعيد المفتاح الأساسي المُولّد لأحدث صف مُدرج. على سبيل المثال، LAST_INSERT_ID() في MySQL .
- استخدام مجموعة فريدة من العناصر من عبارة SQL INSERT الأصلية في عبارة SELECT لاحقة .
- استخدام GUID في عبارة SQL INSERT واسترجاعه في عبارة SELECT .
- استخدام عبارة OUTPUT في عبارة SQL INSERT لـ MS-SQL Server 2005 و MS-SQL Server 2008.
- استخدام عبارة INSERT مع عبارة RETURNING في Oracle .
أَدْخِلْ فِي جَدْوَلِ phone_book الْقِيَمَ التَّالِيَةَ ( 'بيتر دو' , '555-2323' ) وَأَسْعَدْ مُعَرِّفُ phone_book_id فِي v_pb_id
- استخدام عبارة INSERT مع عبارة RETURNING في PostgreSQL (منذ الإصدار 8.2). القائمة المُعادة مطابقة لنتيجة عبارة INSERT .
- يستخدم Firebird نفس الصيغة في عبارات لغة تعديل البيانات (DSQL)؛ حيث يمكن للعبارة إضافة صف واحد كحد أقصى. [ 2 ] أما في الإجراءات المخزنة والمشغلات وكتل التنفيذ (PSQL)، فتُستخدم صيغة Oracle المذكورة آنفًا. [ 3 ]
أَدْخِلْ فِي جَدْوَلِ phone_book الْقِيَمَ التَّالِيَةَ ( 'بيتر دو' , '555-2323' ) وَأَسْتَرِي مَعَرِّفَةِ phone_book_id
- يستخدم Firebird نفس الصيغة في عبارات لغة تعديل البيانات (DSQL)؛ حيث يمكن للعبارة إضافة صف واحد كحد أقصى. [ 2 ] أما في الإجراءات المخزنة والمشغلات وكتل التنفيذ (PSQL)، فتُستخدم صيغة Oracle المذكورة آنفًا. [ 3 ]
- يؤدي استخدام الدالة IDENTITY() في H2 إلى إرجاع آخر هوية تم إدخالها.
حدد الهوية ();
المحفزات
إذا تم تعريف مُشغّلات على الجدول الذي تُنفّذ عليه عبارة INSERT ، فسيتم تقييم هذه المُشغّلات في سياق العملية. تسمح مُشغّلات BEFORE INSERT بتعديل القيم المراد إدراجها في الجدول. أما مُشغّلات AFTER INSERT فلا يمكنها تعديل البيانات، ولكن يمكن استخدامها لبدء إجراءات على جداول أخرى، على سبيل المثال، لتنفيذ آلية تدقيق.
مراجع
- ↑ "Oracle PL/SQL: INSERT ALL" . psoug.org . مؤرشف من الأصل بتاريخ 16-09-2010 . تم الاطلاع عليه بتاريخ 02-09-2010 .
- ↑ "تحديث مرجع لغة فايربيرد 2.5" . تم الاطلاع عليه بتاريخ 24-10-2011 .
- ↑ "قاموس لغة SQL الخاص بـ Firebird" .
روابط خارجية
- عبارة INSERT في Oracle SQL (مرجع لغة SQL لقاعدة بيانات Oracle، الإصدار 11g الإصدار 2 (11.2) على oracle.com)
- أمثلة على استعلامات الإلحاق في مايكروسوفت أكسس وبنية استعلام الإدراج في SQL
- عبارة INSERT في MySQL (دليل مرجعي لـ MySQL 5.5)
- كلمات SQL الرئيسية
