سنتعرف في مقال اليوم على تعليمة DELETE
في لغة الاستعلام البنيوية SQL واحدة من أقوى العمليات المتاحة للمستخدمين. وهي كما يوحي اسمها، تحذف سجلًا أو أكثر من جدول قاعدة البيانات على نحوٍ لا يمكن التراجع عنه. ومن المهم لمستخدمي SQL فهم كيف تعمل تعليمة DELETE
باعتبارها جانبًا أساسيًا من إدارة البيانات.
سيغطي المقال كيفية استخدام صيغة DELETE
في SQL لحذف البيانات من جدول واحد أو أكثر. كما سيشرح كيف تتعامل SQL مع عمليات الحذف التي قد تتعارض مع قيود المفتاح الخارجي Foreign key.
مستلزمات العمل
لمتابعة الخطوات في هذا المقال، ستحتاج إلى جهاز حاسوب يُشغّل أحد أنواع أنظمة إدارة قواعد البيانات العلاقية RDBMS التي تستخدم SQL. وقد اختبرنا الأوامر البرمجية والأمثلة في هذا المقال مستخدمين البيئة التالية:
- خادم عامل على توزيعة أوبنتو، مع مستخدم ذو صلاحيات مسؤول مختلف عن المستخدم الجذر، وجدار حماية مكوّن باستخدام UFW، ويمكنك إعداد الخادم بالاستعانة بمقال كيفية تثبيت توزيعة أوبنتو من لينكس بأبسط طريقة.
- MySQL مثبتة ومؤمنة على الخادم، كما هو موضح في المقال كيفية تثبيت MySQL على أوبونتو. وقد نفذنا خطوات هذا المقال باستخدام مستخدم MySQL مختلف عن المستخدم الجذر، مُنشأ وفق الطريقة الموضحة في الخطوة 3 من هذا المقال.
ملاحظة: تجدر الإشارة إلى أنّ الكثير من أنظمة إدارة قواعد البيانات العلاقية لها تقديماتها الفريدة من لغة SQL. فبالرغم من كون الأوامر المُقدمة في هذا المقال ستعمل مع معظم هذه الأنظمة، ولكن قد تجد بعض الاختلافات في الصيغة أو الناتج عند تنفيذها على أنظمة مختلفة عن MySQL.
وبالعودة إلى مستلزمات العمل، ستحتاج أيضًا إلى قاعدة بيانات وجدول مُحمّل ببعض البيانات التجريبية النموذجية لتتمكن من التدرب على حذف البيانات. لذا ننصحك بقراءة الفقرة التالية الاتصال بـ MySQL وإعداد قاعدة بيانات تجريبية نموذجية للمزيد من التفاصيل حول كيفية إعداد قاعدة بيانات وجدول لاستخدامهما في الأمثلة خلال هذا المقال.
الاتصال بـ MySQL وإعداد قاعدة بيانات تجريبية نموذجية
إذا كان نظام قاعدة بيانات SQL الخاص بك يعمل على خادم عن بُعد، اتصل بالخادم مُستخدمًا بروتوكول SSH من جهازك المحلي على النحو:
$ ssh ssh user@your_server_ip
ثم افتح واجهة سطر الأوامر في خادم MySQL، مُستبدلًا user
باسم حساب مستخدم MySQL الخاص بك:
$ mysql -u user -p
أنشئ قاعدة بيانات باسمdeleteDB
:
mysql> CREATE DATABASE deleteDB;
وبمجرّد إنشاء قاعدة البيانات بنجاح ستحصل على خرجٍ كالتالي:
الخرج Query OK, 1 row affected (0.01 sec)
ولاختيار قاعدة البيانات deleteDB
، نفّذ تعليمة USE
التالية:
mysql> USE deleteDB;
الخرج Database changed
بعد اختيار قاعدة البيانات deleteDB
، أنشئ جدولين داخلها. كمثال، تخيل أنك وبعض أصدقائك تملكون ناديًا حيث يمكن للأعضاء مشاركة المعدات الموسيقية مع بعضهم البعض. فقررت إنشاء بعض الجداول لتساعدك في تتبع أعضاء النادي ومعداتهم. سيتضمّن الجدول الأول الأعمدة الأربعة التالية:
-
memberID
: مُعرّف كل عضو في النادي، مُعبّر عنه بنمط بيانات الأعداد الصحيحةint
. سيكون هذا العمود هو المفتاح الأساسي للجدول. -
name
: اسم كل عضو، مُعبّر عنه بنمط بيانات المحارفvarchar
مع حد أقصى يصل إلى 30 محرفًا. -
homeBorough
: هذا العمود سيخزن المنطقة التي يعيش فيها كل عضو، مُعبر عنه بنمط البياناتvarchar
ولكن بحد أقصى يصل إلى 15 محرفًا فقط. -
email
: عنوان البريد الإلكتروني الذي يمكن من خلاله الاتصال بكل عضو، مُعبر عنه بنمط البياناتvarchar
مع حد أقصى يصل إلى 30 محرفًا.
لننشئ إذًا جدولًا باسم clubMembers
يحتوي على هذه الأعمدة الأربعة.
mysql> CREATE TABLE clubMembers ( mysql> memberID int PRIMARY KEY, mysql> name varchar(30), mysql> homeBorough varchar(15), mysql> email varchar(30) mysql> );
أمّا الجدول الثاني فسيتضمّن الأعمدة التالية:
-
equipmentID
: معرّف فريد لكل قطعة من المعدات. إذ ستكون القيم في هذا العمود من نمط بيانات الأعداد الصحيحةint
. وسيكون هذا العمود هو المفتاح الأساسي للجدول على نحوٍ مشابه لعمودmemberID
في جدولclubMembers
، -
equipmentType
: نوع الآلة أو الأداة التي يُمثّلها كل سجل (على سبيل المثال الغيتارguitar
ومازج الأصواتmixer
ومضخّم الصوتamplifier
وما إلى ذلك). سنعبّر عن هذه القيم باستخدام نمط البياناتvarchar
مع حد أقصى يصل إلى 30 محرفًا. -
brand
: العلامة التجارية التي أنتجت كل قطعة من المعدات، معبّر عنها أيضًا بنمط البياناتvarchar
مع حد أقصى يصل إلى 30 محرفًا. -
ownerID
: هذا العمود سيحتوي على معرّف العضو المالك للقطعة نت المعدات، مُعبر عنه برقم صحيح.
ولضمان أنّ عمود ownerID
لن يتضمّن سوى قيم تُمثّل مُعرّفات أعضاء صالحة، يمكنك إنشاء قيد مفتاح خارجي عليه بحيث يُشير إلى عمود memberID
في جدول clubMembers
. يُعد قيد المفتاح الخارجي طريقة لتحديد علاقة بين جدولين، إذ يفرض أن تكون القيم في العمود المُطبّق عليه موجودة بالفعل في العمود المُشار إليه. في المثال التالي، يشترط قيد المفتاح الخارجي أن تكون كل قيمة تُضاف إلى عمود ownerID
موجودة مسبقًا في عمود memberID
.
أنشئ جدولًا بهذه الأعمدة وهذا القيد باسم clubEquipment
:
mysql> CREATE TABLE clubEquipment ( mysql> equipmentID int PRIMARY KEY, mysql> equipmentType varchar(30), mysql> brand varchar(15), mysql> ownerID int, mysql> CONSTRAINT fk_ownerID mysql> FOREIGN KEY (ownerID) REFERENCES clubMembers(memberID) mysql> );
ومن الجدير بالملاحظة أنّ هذا المثال يوفّر اسمًا لقيد المفتاح الخارجي، ألا وهو: fk_ownerID
.
إذ تُنشئ MySQL تلقائيًا اسمًا لأي قيد تضيفه، إلّا أنّ تحديد اسم من قبلنا في هذه الحالة سيكون مفيدًا عندما نحتاج للإشارة إلى هذا القيد لاحقًا.
بعد ذلك، نفّذ تعليمة INSERT INTO
التالية لملء جدول clubMembers
بستة سجلات من البيانات النموذجية:
mysql> INSERT INTO clubMembers mysql> VALUES mysql> (1, 'Rosetta', 'Manhattan', 'hightower@example.com'), mysql> (2, 'Linda', 'Staten Island', 'lyndell@example.com'), mysql> (3, 'Labi', 'Brooklyn', 'siffre@example.com'), mysql> (4, 'Bettye', 'Queens', 'lavette@example.com'), mysql> (5, 'Phoebe', 'Bronx', 'snow@example.com'), mysql> (6, 'Mariya', 'Brooklyn', 'takeuchi@example.com');
ثم نفّذ تعليمة INSERT INTO
أخرى لملء جدول clubEquipment
بعشرين سجلًا من البيانات النموذجية:
mysql> INSERT INTO clubEquipment mysql> VALUES mysql> (1, 'electric guitar', 'Gilled', 6), mysql> (2, 'trumpet', 'Yemehe', 5), mysql> (3, 'drum kit', 'Purl', 3), mysql> (4, 'mixer', 'Bearinger', 3), mysql> (5, 'microphone', 'Sure', 1), mysql> (6, 'bass guitar', 'Fandar', 4), mysql> (7, 'acoustic guitar', 'Marten', 6), mysql> (8, 'synthesizer', 'Korgi', 4), mysql> (9, 'guitar amplifier', 'Vax', 4), mysql> (10, 'keytar', 'Poland', 3), mysql> (11, 'acoustic/electric bass', 'Pepiphone', 2), mysql> (12, 'trombone', 'Cann', 2), mysql> (13, 'mandolin', 'Rouge', 1), mysql> (14, 'electric guitar', 'Vax', 6), mysql> (15, 'accordion', 'Nonher', 5), mysql> (16, 'electric organ', 'Spammond', 1), mysql> (17, 'bass guitar', 'Peabey', 1), mysql> (18, 'guitar amplifier', 'Fandar', 3), mysql> (19, 'cello', 'Yemehe', 2), mysql> (20, 'PA system', 'Mockville', 5);
وبذلك، غدوتَ جاهزًا لمتابعة باقي المقال وبدء التعلم حول كيفية حذف البيانات باستخدام لغة الاستعلام البنيوية SQL.
حذف البيانات من جدول واحد
إنّ الصيغة العامة لحذف البيانات في SQL على النحو:
mysql> DELETE FROM table_name mysql> WHERE conditions_apply;
تحذير: الجزء المهم من هذه الصيغة هو البنية WHERE
فمن خلالها يمكنك تحديد السجلات التي يجب حذفها بدقة. وبدونها، سيُنفَّذ أمر مثل DELETE FROM table_name;
على نحوٍ صحيح، ولكنه سيحذف كل سجلات البيانات من الجدول!
وبالعودة إلى موضوعنا، تذكّر أنّ أي عملية حذف ناجحة لا يمكن التراجع عنها. فإذا نفذّت عملية حذف دون معرفة دقيقة بالبيانات التي ستُحذف، فقد تحذف سجلات عن طريق الخطأ. ومن الطرق التي تفيدك في التأكد من عدم حذف بيانات عن طريق الخطأ هي إجراء استعلام عن البيانات المحددة للحذف باستخدام SELECT
لرؤية البيانات التي ستعيدها بنية WHERE
ضمن عملية الحذف DELETE
من البداية قبل تنفيذ عملية الحذف.
ولتوضيح الأمر، لنفترض أنّك تريد إزالة أي سجلات مُتعلقة بمعدات الموسيقى المصنعة من قبل العلامة التجارية Korgi. ولكنك قررت البدء بكتابة استعلام لرؤية كافة سجلات الآلات المُتضمنة لعلامة korgi
تحديدًا في عمود brand
.
لمعرفة الآلات الموسيقية في جدولك المُصنّعة من قبل Korgi، يمكنك تنفيذ الاستعلام المبيّن أدناه. ومن الجدير بالملاحظة أنّه وعلى العكس من الاستعلام باستخدام SELECT
أو عملية INSERT INTO
، فلا تسمح عمليات الحذف بتحديد أعمدة فردية، لأنها مُخصصّة لحذف سجلات البيانات بالكامل.
ولمحاكاة هذا السلوك، أتبعنا الكلمة المفتاحية SELECT
بعلامة النجمة (*
) في الاستعلام التالي والتي تعدّ اختصارًا في SQL يمثل "كل الأعمدة":
mysql> SELECT * FROM clubEquipment mysql> WHERE brand = 'Korgi';
الخرج +-------------+---------------+-------+---------+ | equipmentID | equipmentType | brand | ownerID | +-------------+---------------+-------+---------+ | 8 | synthesizer | Korgi | 4 | +-------------+---------------+-------+---------+ 1 row in set (0.00 sec)
ولحذف هذا السجل، عليك تنفيذ عملية حذف DELETE
تحتوي على بنيتي FROM
وWHERE
مطابقتين لاستعلام SELECT
السابق، على النحو:
mysql> DELETE FROM clubEquipment mysql> WHERE brand = 'Korgi';
الخرج Query OK, 1 row affected (0.01 sec)
يُظهر هذا الخرج أن عملية الحذف DELETE
قد نُفِّذت على سجل واحد فقط. ولكن بإمكانك حذف عدة سجلات باستخدام بنية WHERE
تُعيد أكثر من سجل واحد.
أمّا استعلام SELECT
التالي فيعيد كافّة السجلات في جدول clubEquipment
التي يتضمن عمود equipmentType
فيها كلمة electric
:
mysql> SELECT * FROM clubEquipment mysql> WHERE equipmentType LIKE '%electric%';
الخرج +-------------+------------------------+-----------+---------+ | equipmentID | equipmentType | brand | ownerID | +-------------+------------------------+-----------+---------+ | 1 | electric guitar | Gilled | 6 | | 11 | acoustic/electric bass | Pepiphone | 2 | | 14 | electric guitar | Vax | 6 | | 16 | electric organ | Spammond | 1 | +-------------+------------------------+-----------+---------+ 4 rows in set (0.00 sec)
ولحذف هذه السجلات الأربعة، لنعد كتابة الاستعلام السابق مستبدلين SELECT *
بتعليمة DELETE
:
mysql> DELETE FROM clubEquipment mysql> WHERE equipmentType LIKE '%electric%';
الخرج Query OK, 4 rows affected (0.00 sec)
كما من الممكن استخدام الاستعلامات الفرعية Subqueries لإعادة وحذف مجموعات نتائج أكثر تفصيلاً. ويُعرّف الاستعلام الفرعي بأنّه عملية استعلام كاملة - تعليمة SQL تبدأ بـ SELECT
وتتضمن بنية FROM
- مُضمنة ضمن عملية أخرى، تأتي عقب بنية FROM
الخاصة بالعملية المحيطة (الاستعلام الرئيسي).
على سبيل المثال، لنفترض أنك ترغب في حذف أي معدات مُدرجة في جدول clubEquipment
تخص أي عضو يبدأ اسمه بالحرف "L". يمكنك أولاً الاستعلام عن هذه البيانات باستخدام تعليمة SELECT
كالتالي:
mysql> SELECT * mysql> FROM clubEquipment mysql> WHERE ownerID IN mysql> (SELECT memberID FROM clubMembers mysql> WHERE name LIKE 'L%');
تُعيد هذه العملية كل سجل من جدول clubEquipment
تظهر قيمة عمود ownerID
الخاصة به ضمن القيم المُعادة من الاستعلام الفرعي الذي يبدأ في السطر الرابع. إذ يُعيد هذا الاستعلام الفرعي مُعرّف العضو memberID
لأي سجل تبدأ قيمة العمود name
الموافقة له بالحرف "L":
الخرج +-------------+------------------+-----------+---------+ | equipmentID | equipmentType | brand | ownerID | +-------------+------------------+-----------+---------+ | 12 | trombone | Cann | 2 | | 19 | cello | Yemehe | 2 | | 3 | drum kit | Purl | 3 | | 4 | mixer | Bearinger | 3 | | 10 | keytar | Poland | 3 | | 18 | guitar amplifier | Fandar | 3 | +-------------+------------------+-----------+---------+ 6 rows in set (0.00 sec)
يمكنك بعد ذلك حذف هذه البيانات باستخدام تعليمة DELETE
التالية:
mysql> DELETE FROM clubEquipment mysql> WHERE ownerID IN mysql> (SELECT memberID FROM clubMembers mysql> WHERE name LIKE 'L%');
الخرج Query OK, 6 rows affected (0.01 sec)
حذف البيانات من عدة جداول
يمكنك حذف البيانات من أكثر من جدول في عملية واحدة عن طريق تضمين بنية JOIN
.
تُستخدم بنى JOIN
لدمج السجلات من جدولين أو أكثر في نتيجة استعلام واحد. يتم ذلك عن طريق إيجاد عمود مشترك بين الجداول وفرز النتائج على نحوٍ مناسب في الخرج.
تبدو صيغة عملية الحذف التي تتضمن بنية JOIN
على النحو التالي:
mysql> DELETE table_1, table_2 mysql> FROM table_1 JOIN table_2 mysql> ON table_2.related_column = table_1.related_column mysql> WHERE conditions_apply;
لاحظ أنه نظرًا لقدرة صيغ الدمج JOIN على مقارنة البيانات من عدة جداول، فإن صيغة هذا المثال تُوضّح الجدول المُستهدف لكل عمود بوضع اسم الجدول متبوعًا بنقطة قبل اسم العمود، وهذا ما يُعرف بالإشارة الكاملة والمؤهلة للعمود. ويُمكنك تحديد الجدول المصدر لكل عمود بهذه الطريقة في أي عملية، على الرغم من عدم ضرورتها عند الاختيار من جدول واحد فقط كما فعلنا في الأمثلة السابقة.
لتوضيح مفهوم حذف البيانات باستخدام بنية JOIN
، لنفترض أن ناديك قرر تحديد العلامات التجارية للمعدات الموسيقية التي يمكن للأعضاء مشاركتها. نفّذ الأمر التالي لإنشاء جدول باسم prohibitedBrands
حيث ستسرد العلامات التجارية التي لم تعد مقبولة في النادي. يحتوي هذا الجدول على عمودين فقط، كلاهما يستخدم نمط بيانات varchar
، لتخزين اسم كل علامة تجارية والبلد الذي تعمل فيه:
mysql> CREATE TABLE prohibitedBrands ( mysql> brandName varchar(30), mysql> homeCountry varchar(30) mysql> );
ثم املأ هذا الجدول الجديد ببعض البيانات النموذجية التجريبية:
mysql> INSERT INTO prohibitedBrands mysql> VALUES mysql> ('Fandar', 'USA'), mysql> ('Givson', 'USA'), mysql> ('Muug', 'USA'), mysql> ('Peabey', 'USA'), mysql> ('Yemehe', 'Japan');
بعد ذلك، يقرر النادي حذف أي سجلات للمعدات من جدول clubEquipment
التي تظهر علاماتها التجارية في جدول prohibitedBrands
ومقرها في الولايات المتحدة.
يمكنك الاستعلام عن هذه البيانات بتنفيذ عملية استعلام مثل التالية باستخدام SELECT
. إذ تدمج هذه العملية جدولي clubEquipment
وprohibitedBrands
معًا، وتُرجع فقط السجلات التي تشترك فيها أعمدة brand
وbrandName
في نفس القيمة. وتعمل بنية WHERE
على إتمام تحديد نتائج الاستعلام بإقصاء أي علامة تجارية لا تتضمن القيمة "USA" في عمود homeCountry
:
mysql> SELECT * mysql> FROM clubEquipment JOIN prohibitedBrands mysql> ON clubEquipment.brand = prohibitedBrands.brandName mysql> WHERE homeCountry = 'USA';
الخرج +-------------+---------------+--------+---------+-----------+-------------+ | equipmentID | equipmentType | brand | ownerID | brandName | homeCountry | +-------------+---------------+--------+---------+-----------+-------------+ | 6 | bass guitar | Fandar | 4 | Fandar | USA | | 17 | bass guitar | Peabey | 1 | Peabey | USA | +-------------+---------------+--------+---------+-----------+-------------+ 2 rows in set (0.00 sec)
هذه هي كل المعلومات التي نبحث عنها؛ وهي كل علامة تجارية مقرها الولايات المتحدة والموجودة في جدول prohibitedBrands
والتي تظهر أيضًا في جدول clubEquipment
.
لحذف هذه العلامات التجارية من جدول prohibitedBrands
والمعدات المرتبطة بها من جدول clubEquipment
، أعد كتابة استعلام SELECT
السابق ولكن استبدل تعليمة SELECT *
بتعليمة DELETE
متبوعةً بأسماء كلا الجدولين:
mysql> DELETE clubEquipment, prohibitedBrands mysql> FROM clubEquipment JOIN prohibitedBrands mysql> ON clubEquipment.brand = prohibitedBrands.brandName mysql> WHERE homeCountry = 'USA';
الخرج Query OK, 4 rows affected (0.01 sec)
يشير هذا الخرج إلى أن العملية حذفت أربع سجلات من قاعدة البيانات: سجلين من جدول clubEquipment
وسجلين من جدول prohibitedBrands
. إذا كنت تريد حذف السجلات من جدول clubEquipment
فقط والاحتفاظ بجميع السجلات في جدول prohibitedBrands
، فعليك إدراج clubEquipment
فقط بعد كلمة DELETE
، والعكس صحيح.
تغيير سلوك تعليمة DELETE للمفاتيح الخارجية
ستفشل أي تعليمة DELETE
قد تسبب تعارضًا مع قيد FOREIGN KEY
افتراضيًا.
بالعودة إلى فقرة الاتصال بـ MySQL وإعداد قاعدة بيانات تجريبية نموذجية في مستلزمات العمل وبتذكّر أنّ العمود ownerID
في جدول المعدات clubEquipment
هو مفتاح خارجي يشير إلى عمود memberID
في جدول الأعضاء clubMembers
. فهذا يعني أنّ أي قيمة مُدخلة في عمود ownerID
يجب أن تكون موجودة بالفعل في جدول memberID
.
إذا حاولت إزالة سجل من جدول clubMembers
تُستخدم قيمة memberID
المُخصصة له في مكان ما ضمن عمود ownerID
من جدول clubEquipment
، سيؤدي ذلك إلى ظهور خطأ.
mysql> DELETE FROM clubMembers mysql> WHERE memberID = 6;
الخرج ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails
يمكنك تجنب هذا الخطأ بإزالة أي سجلات في الجدول الابن (clubEquipment
في هذا المثال) حيث توجد قيمة المفتاح الخارجي في الجدول الأب (clubMembers
). كبديل، يمكنك تغيير هذا السلوك بتعديل قيد المفتاح الخارجي القائم بآخر يعالج عمليات الحذف على نحوٍ مختلف.
ملاحظة: لا تسمح كافة أنظمة إدارة قواعد البيانات العلاقية أو محركاتها بإضافة أو إزالة قيود من جدول قائم كما هو موضح في الفقرات اللاحقة. فإذا كنت تستخدم نظام RDBMS غير MySQL، يجب عليك مراجعة الوثائق الرسمية الخاصة به لفهم القيود المتعلقة بإدارة القيود.
وبالعودة إلى موضوعنا، بذلك ستكون قادرًا على تحديث قيمة clientID
لأي سجل في الجدول الأب clubMembers
، وستنتقل هذه التغييرات بشكل تلقائي إلى أي سجلات في الجدول الابن clubEquipment
المرتبطة به. لاستبدال القيد الحالي، يجب أولًا إزالته باستخدام تعليمة ALTER TABLE
. تذكر أننا في تعليمة CREATE TABLE
لجدول clubEquipment
، قمنا بتحديد fk_ownerID
كاسم لقيد المفتاح الخارجي للجدول.
mysql> ALTER TABLE clubEquipment mysql> DROP FOREIGN KEY fk_ownerID;
الخرج Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0
بعد ذلك، أنشئ قيد مفتاح خارجي جديد مُعدّ ليتعامل مع عمليات الحذف DELETE
بطريقة تتناسب مع حالة الاستخدام المعطاة. بصرف النظر عن الإعداد الافتراضي الذي يمنع تعليمات DELETE
التي تخالف المفتاح الخارجي، هناك خياران آخران متاحان في معظم أنظمة إدارة قواعد البيانات العلاقية:
-
ON DELETE SET NULL
: يسمح لك هذا الخيار بحذف السجلات من الجدول الأب، وسيعيد تعيين أي قيم مرتبطة بها في الجدول الابن على أنها قيم فارغةNULL
. -
ON DELETE CASCADE
: عند حذف سجل في الجدول الأب، سيدفع هذا الخيار SQL لحذف أي سجلات في الجدول الابن مرتبطة بذلك السجل من الجدول الأب.
في سياق هذا المثال، لا يُعد استخدام خيار ON DELETE SET NULL
منطقيًا. فإذا غادر أحد الأعضاء النادي وحُذِف سجله من جدول clubMembers
، فلن تكون معداته متاحة للأعضاء المتبقين بعد الآن وبالتالي يجب إزالتها من جدول clubEquipment
. وفي هذا الصدد يُعدّ خيار ON DELETE CASCADE
هو الأنسب لهذا السياق.
لإضافة قيد FOREIGN KEY
يعمل وفق آلية ON DELETE CASCADE
، نفّذ أمر ALTER TABLE
التالي لتعديل الجدول. ستنشئ هذه التعليمة قيدًا جديدًا باسم newfk_ownerID
يعكس تعريف القيد السابق ولكن مع إضافة خيار ON DELETE CASCADE
.
mysql> ALTER TABLE clubEquipment mysql> ADD CONSTRAINT newfk_ownerID mysql> FOREIGN KEY (ownerID) mysql> REFERENCES clubMembers(memberID) mysql> ON DELETE CASCADE;
الخرج Query OK, 7 rows affected (0.07 sec) Records: 7 Duplicates: 0 Warnings: 0
تشير هذه النتائج إلى أن العملية قد أثرت على جميع السجلات السبعة المتبقية في جدول clubEquipment
.
ملاحظة: بدلًا من تغيير تعريف جدول مُعرّف مسبقًا لتعديل كيفية تفاعل قيد المفتاح الخارجي مع عمليات DELETE
، يُمكنك من البداية تحديد هذا السلوك عند إنشاء الجدول بواسطة تعليمة إنشاء الجدول CREATE TABLE
، وبذلك تُعيّن السلوك المطلوب مُسبقًا، على النحو التالي:
mysql> CREATE TABLE clubEquipment ( mysql> equipmentID int PRIMARY KEY, mysql> equipmentType varchar(30), mysql> brand varchar(15), mysql> ownerID int, mysql> CONSTRAINT fk_ownerID mysql> FOREIGN KEY (ownerID) REFERENCES clubMembers(memberID) mysql> ON DELETE CASCADE mysql> );
عقب ذلك، ستكون قادرًا على حذف أي سجل من جدول clubMembers
، وستُحذف جميع السجلات المرتبطة به في جدول clubEquipment
تلقائيًا:
mysql> DELETE FROM clubMembers mysql> WHERE memberID = 6;
الخرج Query OK, 1 row affected (0.00 sec)
رغم أن هذا الخرج يشير إلى تأثر سجل واحد فقط، إلا أنّ العملية قد حذفت أيضًا كافة سجلات المعدات في جدول clubEquipment
ذات القيمة 6
في عمود ownerID
.
الخلاصة
باطلاعك على هذا المقال، اكتسبت المعرفة حول كيفية حذف البيانات الموجودة في جدول واحد أو أكثر باستخدام تعليمة DELETE
في SQL. كما تعرفت على كيفية تعامل SQL مع عمليات الحذف التي تتعارض مع قيود المفتاح الخارجي وطرق تغيير هذا السلوك الافتراضي.
ومن المفترض أن تعمل الأوامر المشروحة في هذا المقال مع أي نظام لإدارة قواعد البيانات يستخدم SQL. لكن تذكر أن لكل قاعدة بيانات SQL تقديمها الخاص للغة، لذا ينبغي مراجعة التوثيق الرسمي لنظام إدارة قواعد البيانات الخاص بك للحصول على وصف أكثر تفصيلاً لكيفية التعامل مع عمليات الحذف والخيارات المتاحة لها.
وللمزيد حول SQL، نشجعك على متابعة المقالات المنشورة تحت وسم سلسلة تعلم SQL في أكاديمية حسوب.
ترجمة -وبتصرف- للمقال How To Delete Data in SQL لصاحبه Mark Drake.
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.