SQLite إدراج وتحديث وحذف الاستعلام مع مثال
بنود تعديل البيانات في SQLite هي عبارات INSERT وUPDATE وDELETE. يتم استخدامه لإدراج صفوف جديدة، أو تحديث القيم الموجودة، أو حذف صفوف من قاعدة البيانات.
لاحظ أنه بالنسبة لجميع الأمثلة التالية، يتعين عليك تشغيل sqlite3.exe وفتح اتصال بقاعدة البيانات النموذجية كتدفق:
الخطوة 1) في هذه الخطوة،
- افتح جهاز الكمبيوتر وانتقل إلى الدليل التالي "ج:\sqlite"و"
- ثم افتح "sqlite3.exe"
الخطوة 2) افتح قاعدة البيانات "البرامج التعليميةSampleDB.db"بالأمر التالي:
.open TutorialsSampleDB.db
أنت الآن جاهز لتشغيل أي نوع من الاستعلامات في قاعدة البيانات.
SQLite INSERT
SQLite يتم استخدام INSERT لإدراج السجلات في جدول محدد لقاعدة البيانات. يجب عليك استخدام جملة "INSERT". بناء جملة جملة INSERT كما يلي:
- بعد جملة INSERT، يجب عليك تحديد الجدول الذي تريد إدراج القيم فيه.
- بعد اسم الجدول تكتب قائمة الأعمدة التي تريد إدراج القيم فيها.
- يمكنك تجاهل اسم الأعمدة وعدم الكتابة إليها.
- إذا لم تكتب اسم الأعمدة، فسيتم إدراج القيم في جميع الأعمدة الموجودة في الجدول بنفس الترتيب، ويتم تعريف الأعمدة في الجدول.
- بعد جملة VALUES، يجب عليك إدراج القيم التي سيتم إدراجها.
- تقوم كل عبارة INSERT بإدراج صف واحد فقط. إذا كنت تريد إدراج صفوف متعددة، فيجب عليك كتابة جمل INSERT متعددة، واحدة لكل صف.
SQLite إدراج مثال
في المثال التالي، سنقوم بإدراج صفين في جدول الطلاب، صف واحد لكل طالب:
INSERT INTO Students(StudentId, StudentName, DepartmentId, DateOfBirth)
VALUES(11, 'Ahmad', 4, '1997-10-12');
INSERT INTO Students VALUES(12, 'Aly', 4, '1996-10-12');
يجب أن يتم تشغيل هذا بنجاح ولا يوجد أي إخراج لهذا:
سيؤدي هذا إلى إدراج طالبين:
- الطالب الأول بمعرف الطالب = 11، واسم الطالب = أحمد، ومعرف القسم = 4، وتاريخ الميلاد = 1997-10-12.
- الطالب الثاني بمعرف الطالب = 12، واسم الطالب = علي، ومعرف القسم = 4، وتاريخ الميلاد = 1996-10-12.
في البيان الأول قمنا بإدراج أسماء الأعمدة “معرف الطالب، اسم الطالب، معرف القسم، تاريخ الميلاد". ومع ذلك، في البيان الثاني، لم نفعل ذلك.
القيم الأربع "12، علي، 4، 1996/10/12" سيتم إدراجها في جميع الأعمدة الأربعة لجدول الطلاب بنفس ترتيب تحديد الأعمدة.
الآن، دعنا نتحقق من إدخال الطالبين في جدول الطلاب من خلال تشغيل الأمر التالي سؤال:
SELECT * FROM Students;
ثم يجب أن ترى الطالبين اللذين تم إرجاعهما من هذا الاستعلام على النحو التالي:
SQLite تحديث
SQLite تُستخدم عبارة UPDATE لتعديل السجلات الموجودة في جدول. يمكنك استخدام عبارة WHERE مع عبارة UPDATE لتحديث الصفوف المحددة. تعمل عبارة UPDATE على تحديث جدول عن طريق تغيير قيمة عمود معين. فيما يلي صيغة عبارة UPDATE:
كالتالي:
- بعد "شرط التحديث"، يجب عليك كتابة اسم الجدول المراد تحديثه.
- يجب عليك كتابة "جملة SET" التي تستخدم لكتابة اسم العمود المراد تحديثه والقيمة المراد تحديثها.
- يمكنك تحديث أكثر من عمود. يمكنك استخدام فاصلة بين كل سطر.
- يمكنك تحديد جملة WHERE لتحديد بعض الصفوف فقط. يتم تحديث الصفوف التي يتم تقييمها على أنها صحيحة فقط. إذا لم تحدد جملة WHERE، فسيتم تحديث جميع الصفوف.
SQLite تحديث المثال
في بيان التحديث التالي، سنقوم بتحديث DepartmentId للطالب الذي يحتوي على StudentId = 6 ليصبح 3:
UPDATE Students SET DepartmentId = 3 WHERE StudentId = 6;
يجب أن يتم تشغيل هذا بنجاح ويجب ألا تحصل على أي مخرجات:
في جملة UPDATE، حددنا أننا نريد تحديث جدول الطلاب.
- في جملة WHERE، قمنا بتصفية جميع الطلاب لتحديد الصف الخاص بـ StudentId = 6 فقط.
- ستقوم جملة SET بتحديث قيمة معرف القسم للطلاب المحددين لتصبح 3.
الآن، دعونا نتحقق من تحديث الطالب الذي يحمل المعرف 6، عن طريق تشغيل الأمر التالي:
SELECT * FROM Students WHERE StudentId = 6;
يجب أن ترى الآن أن قيمة معرف القسم أصبحت الآن 3 على النحو التالي:
SQLite حذف
SQLite يتم استخدام استعلام DELETE لإزالة السجلات الموجودة من جدول محدد. يمكنك استخدام جملة WHERE مع استعلامات DELETE لحذف الصفوف المحددة.
تحتوي جملة DELETE على الصيغة التالية:
- يجب عليك كتابة اسم الجدول بعد عبارة DELETE FROM التي تريد حذف السجلات منها. (ملاحظة: أن حذف جملة يستخدم لحذف بعض السجلات من جدول أو حذف كافة السجلات ولن يحذف الجدول نفسه. ومع ذلك، جملة إسقاط يستخدم لحذف الجدول بأكمله بكل السجلات الموجودة عليه.)
- إذا كتبت عبارة DELETE مثل "DELETE FROM guru"، فسيؤدي ذلك إلى حذف جميع السجلات من الجدول "guru".
- يمكنك تحديد شرط WHERE بتعبير إذا كنت تريد حذف بعض الصفوف المحددة. سيتم حذف الصفوف التي يتم تقييم التعبير لها على أنها صحيحة فقط. على سبيل المثال، "DELETE FROM guru WHERE id > 5" - سيؤدي هذا إلى حذف السجلات التي تحتوي على معرف أكبر من 5 فقط.
مثال
في البيان التالي، سنقوم بحذف طالبين برقم الطالب 11 و12:
DELETE FROM Students WHERE StudentId = 11 OR StudentId = 12;
التعبير "معرف الطالب = 11 أو معرف الطالب = 12" سيكون صحيحًا فقط للطلاب ذوي المعرفين 11 و12. لذلك سيتم تطبيق شرط الحذف على كليهما وسيتم حذفهما فقط.
يجب أن يتم تنفيذ هذا الأمر بنجاح ويجب ألا تحصل على أي إخراج كما يلي:
يمكنك التأكد من حذف الطالبين، وذلك من خلال تحديد كافة السجلات من جدول الطلاب على النحو التالي:
SELECT * FROM Students;
لا ينبغي أن ترى الطالبين ذوي المعرفين 11 و12 كما يلي:
SQLite بند الصراع
لنفترض أن لديك عمودًا به أحد قيود العمود التالية: UNIQUE أو NOT NULL أو CHECK أو PRIMARY KEY. ثم حاولت إدراج أو تحديث قيمة في هذا العمود بقيمة تتعارض مع هذا القيد.
على سبيل المثال، إذا كان العمود يحتوي على قيد فريد وحاولت إدراج قيمة موجودة بالفعل (قيمة مكررة)، والتي تتعارض مع القيد الفريد. ثم تتيح لك جملة CONFLICT اختيار ما يجب فعله في مثل هذه الحالات لحل هذا التعارض.
قبل أن نواصل شرح كيفية حل جملة CONFLICT للصراع. يجب أن تفهم ما هي معاملة قاعدة البيانات.
معاملة قاعدة البيانات
مصطلح معاملة قاعدة البيانات هو قائمة SQLite العمليات (إدراج أو تحديث أو حذف). يجب تنفيذ معاملة قاعدة البيانات كوحدة واحدة، سواء تم تنفيذ جميع العمليات بنجاح أو لم يتم تنفيذها على الإطلاق. سيتم إلغاء جميع العمليات إذا فشل تنفيذ إحداها.
مثال لمعاملة قاعدة البيانات
تتضمن عملية تحويل الأموال من حساب مصرفي إلى آخر عددًا من الأنشطة. تتضمن عملية التحويل هذه سحب الأموال من الحساب الأول وإيداعها في حساب آخر. يجب إتمام هذه المعاملة بالكامل أو إلغاؤها بالكامل وعدم الفشل في منتصف الطريق.
فيما يلي قائمة بخمسة قرارات يمكنك اختيارها في بند CONFLICT:
- رول باك - سيؤدي هذا إلى التراجع عن المعاملة الحالية SQLite البيان الذي يحتوي على التعارض (سوف يلغي المعاملة بأكملها). على سبيل المثال، إذا كنت تحاول تحديث 10 صفوف، وكان الصف الخامس يحتوي على قيمة تتعارض مع أحد القيود، فلن يتم تحديث أي صفوف، وستظل الصفوف العشرة كما هي. سيتم طرح خطأ.
- إحباط - سيؤدي هذا إلى إحباط (إلغاء) التيار SQLite البيان الوحيد الذي يحتوي على التعارض ولن يتم إلغاء المعاملة. على سبيل المثال، إذا كنت تحاول تحديث 10 صفوف، وكان الصف الخامس يحتوي على قيمة تتعارض مع أحد القيود، فلن يتم تحديث القيمة الخامسة فقط ولكن سيتم تحديث الصفوف التسعة الأخرى. سيتم طرح خطأ.
- يفشل - يجهض التيار SQLite البيان الذي لديه الصراع. ومع ذلك، لن تستمر المعاملة ولكن سيتم الالتزام بالتغييرات السابقة التي تم إجراؤها على الصفوف السابقة للصف الذي يحتوي على التعارض. على سبيل المثال، إذا كنت تحاول تحديث 10 صفوف، وكان الصف الخامس يحتوي على قيمة تتعارض مع أحد القيود، فسيتم تحديث الصفوف الأربعة فقط ولن يتم تحديث الصفوف الأخرى. سيتم طرح خطأ.
- تجاهل - سيؤدي هذا إلى تخطي الصف الذي يحتوي على انتهاك القيد ومواصلة معالجة الصفوف التالية الأخرى من SQLite إفادة. على سبيل المثال، إذا كنت تحاول تحديث 10 صفوف، وكان الصف الخامس يحتوي على قيمة تتعارض مع أحد القيود، فسيتم تحديث الصفوف الأربعة فقط ولن يتم تحديث الصفوف الأخرى. لن يتم المضي قدمًا في تحديث الصفوف الأخرى والتوقف عند الصف الذي يحتوي على قيمة التعارض. لن يتم طرح أي خطأ.
- استبدال – يعتمد ذلك على نوع القيد الذي به المخالفة:
- عندما يكون هناك انتهاك للقيد لقيد UNIQUE أو PRIMARY KEY. سيستبدل REPLACE الصف الذي يسبب الانتهاك بالصف الجديد المدرج أو المحدث.
- عندما يكون هناك انتهاك للقيد NOT NULL، ستستبدل عبارة REPLACE القيمة NULL بالقيمة الافتراضية لذلك العمود. إذا لم يكن العمود يحتوي على قيمة افتراضية، إذن SQLite سيتم إلغاء البيان (سيتم إلغاء البيان)
- في حالة حدوث انتهاك لقيد التحقق، سيتم إحباط البند.
ملاحظة: القرارات الخمسة المذكورة أعلاه هي خيارات لكيفية حل التعارض. قد لا يكون بالضرورة ما ينطبق على حل صراع ما ينطبق على حل أنواع أخرى من الصراعات.
كيفية إعلان جملة CONFLICT
يمكنك إعلان شرط ON CONFLICT عند تعريف قيد لتعريف عمود داخل شرط CREATE TABLE. باستخدام بناء الجملة التالي:
يمكنك اختيار واحد من الحلول الخمسة لحل التعارض كما تم شرحه من قبل.
في حالة النزاع، تجاهل مثال
الخطوة 1) قم بإنشاء موضوع جدول جديد كما يلي:
CREATE TABLE [Subjects] (
[SubjectId] INTEGER NOT NULL PRIMARY KEY ON CONFLICT IGNORE,
[SubjectName] NVARCHAR NOT NULL
);
لاحظ أننا قمنا بتحديد قيد PRIMARY KEY في عمود SubjectId. لن يسمح قيد المفتاح الأساسي بإدراج قيمتين مكررتين في عمود معرف الموضوع بحيث تكون جميع القيم الموجودة في هذا العمود فريدة. لاحظ أيضًا أننا نختار حل النزاع ليكون "تجاهل".
يجب أن يتم تشغيل الأمر بنجاح ويجب ألا تحصل على أي أخطاء:
الخطوة 2) الآن، دعونا ندرج بعض القيم في مواضيع الجدول الجديد، ولكن بقيمة تنتهك قيد المفتاح الأساسي:
INSERT INTO Subjects VALUES(1, 'Algebra'); INSERT INTO Subjects VALUES(2, 'Database Course'); INSERT INTO Subjects VALUES(2, 'Data Structures'); INSERT INTO Subjects VALUES(4, 'Algorithms');
في عبارة INSERT هذه، حاولنا إدراج دورتين لهما نفس معرف موضوع المفتاح الأساسي 2، وهو ما يمثل انتهاكًا لقيود المفتاح الأساسي.
يجب أن تعمل الأوامر بشكل جيد ولا ينبغي أن تحصل على أي أخطاء، على النحو التالي:
الخطوة 3) اختر جميع المواضيع من الجدول كما يلي:
SELECT * FROM Subjects;
سيعطيك هذا قائمة المواضيع:
لاحظ أنه تم إدراج ثلاثة مواضيع فقط "الجبر، دورة قاعدة البيانات، و Algorithms"بدلاً من 4 صفوف.
الصف الذي يحتوي على القيمة التي تنتهك قيد المفتاح الأساسي، وهو "هياكل البيانات" تم تجاهله ولم يتم إدراجه. لكن، SQLite يستمر في تنفيذ العبارات الأخرى بعد هذا الصف.
الخطوة 4) احذف جدول الموضوعات لإنشائه مرة أخرى باستخدام شرط ON CONFLICT مختلف للمثال التالي عن طريق تشغيل الأمر التالي:
DROP TABLE Subjects;
يقوم أمر الإفلات بحذف الجدول بأكمله. مواضيع الجدول غير موجودة الآن.
على سبيل المثال استبدال الصراع
الخطوة 1) قم بإنشاء موضوع جدول جديد كما يلي:
CREATE TABLE [Subjects] (
[SubjectId] INTEGER NOT NULL PRIMARY KEY ON CONFLICT REPLACE,
[SubjectName] NVARCHAR NOT NULL
);
لاحظ أننا قمنا بتحديد قيد PRIMARY KEY في عمود SubjectId. لن يسمح قيد المفتاح الأساسي بإدراج قيمتين مكررتين في عمود معرف الموضوع بحيث تكون جميع القيم الموجودة في هذا العمود فريدة.
لاحظ أيضًا أننا نختار خيار حل النزاع ليكون "استبدال". يجب أن يتم تشغيل الأمر بنجاح ويجب ألا تحصل على أي أخطاء:
الخطوة 2) الآن، لنقم بإدراج بعض القيم في الجدول الجديد "المواضيع"، ولكن بقيمة تنتهك قيد المفتاح الأساسي:
INSERT INTO Subjects VALUES(1, 'Algebra'); INSERT INTO Subjects VALUES(2, 'Database Course'); INSERT INTO Subjects VALUES(2, 'Data Structures'); INSERT INTO Subjects VALUES(4, 'Algorithms');
في عبارة INSERT هذه، حاولنا إدراج دورتين لهما نفس معرف موضوع المفتاح الأساسي 2، وهو ما يمثل انتهاكًا لقيود المفتاح الأساسي.
يجب أن تعمل الأوامر بشكل جيد ولا ينبغي أن تحصل على أي أخطاء، على النحو التالي:
الخطوة 3) اختر جميع المواضيع من الجدول كما يلي:
SELECT * FROM Subjects;
سيعطيك هذا قائمة المواضيع:
لاحظ أنه تم إدراج ثلاثة مواضيع فقط "الجبر، هياكل البيانات، و Algorithms"بينما حاولنا إدراج 4 صفوف.
الصف الذي يحتوي على القيمة التي تنتهك قيد المفتاح الأساسي، وهو "هياكل البيانات"استبدلت القيمة"دورة قاعدة البيانات"كما يلي:
- تعمل عبارات الإدراج الأولين بشكل جيد دون أي مشكلة. سيتم إدراج مادتين الجبر ودورة قواعد البيانات بالمعرفات 1، 2.
- متى SQLite يحاول تشغيل عبارة الإدراج الثالثة باستخدام SubjectId 2 وSubjectName "هياكل البيانات"، اكتشف أن هناك بالفعل موضوعًا بمعرف الموضوع = 2. وهو ما يمثل انتهاكًا لقيد المفتاح الأساسي المحدد في عمود معرف الموضوع.
- SQLite سيختار حل REPLACE لهذا التعارض. فهو يستبدل القيمة الموجودة بالفعل في جدول المواضيع بالقيمة الجديدة من عبارة الإدراج. لذلك "دورة قاعدة البيانات" سيتم استبدال اسم الموضوع بـ "هياكل البيانات" اسم الموضوع.
ملخص
تُستخدم عبارات INSERT وUPDATE وDELETE لتعديل البيانات الموجودة في ملف SQLite قاعدة بيانات. تعد جملة CONFLICT عبارة قوية لحل أي تعارض بين البيانات والبيانات المراد تعديلها.


















