1. ما هو بيان TRUNCATE؟
المفهوم الأساسي لبيان TRUNCATE
بيان TRUNCATE في MySQL هو أمر يُستخدم لإزالة جميع البيانات من جدول في وقت واحد. بخلاف بيان DELETE، الذي يزيل الصفوف بشكل فردي، يعيد TRUNCATE إنشاء الجدول داخليًا لمسح بياناته. هذا يجعله فعالًا للغاية في حذف كميات كبيرة من البيانات بكفاءة.
الصيغة الأساسية
الصيغة الأساسية لبيان TRUNCATE هي كالتالي:
TRUNCATE TABLE table_name;
هذا يزيل جميع الصفوف من الجدول المحدد ويعيد تعيينه إلى حالته الأولية. ومع ذلك، بما أن البيانات المحذوفة لا يمكن استردادها، يجب الحذر عند استخدام هذا الأمر.
مثال: الاستخدام الأساسي
في المثال أدناه، يتم إنشاء جدول users ثم مسحه باستخدام بيان TRUNCATE:
CREATE TABLE users (
id INT AUTO_INCREMENT,
name VARCHAR(100),
PRIMARY KEY (id)
);
INSERT INTO users (name) VALUES ('Taro'), ('Hanako'), ('Jiro');
-- Execute TRUNCATE
TRUNCATE TABLE users;
-- The table is emptied, and AUTO_INCREMENT is reset.
في هذا المثال، يتم إزالة جميع البيانات في الجدول، وعند إدراج بيانات جديدة، ستبدأ عمود id مرة أخرى من 1.

2. الاختلافات بين TRUNCATE و DELETE
الاختلافات في السرعة والأداء
TRUNCATE أسرع بكثير من DELETE لأنه مصمم خصيصًا لمسح الجداول بأكملها. يزيل DELETE الصفوف بشكل فردي، مما قد يكون بطيئًا عند التعامل مع عدد كبير من الصفوف. من ناحية أخرى، يحذف TRUNCATE البيانات عن طريق إعادة إنشاء الجدول داخليًا، مما يجعله فعالًا للغاية في الحذف الجماعي.
مثال: مقارنة الأداء
عند حذف ملايين الصفوف، قد يبدو بيان DELETE كالتالي:
DELETE FROM users WHERE condition;
بالمقابل، يسمح TRUNCATE بحذف جميع الصفوف في وقت واحد باستخدام:
TRUNCATE TABLE users;
يصبح الفرق في الأداء أكثر وضوحًا مع الجداول الكبيرة جدًا — قد يستغرق DELETE وقتًا طويلًا، بينما ينتهي TRUNCATE تقريبًا فورًا.
اختلافات التراجع
لا يمكن تراجع بيان TRUNCATE. بمجرد تنفيذه، يتم حذف البيانات نهائيًا ولا يمكن استعادتها. بالمقابل، يمكن تراجع DELETE عند استخدامه داخل معاملة، مما يسمح بالاسترداد في حالة حدوث أخطاء. هذا يجعل DELETE أكثر أمانًا في سياقات معينة.
اختلافات الحذف الانتقائي
يمكن لبيان DELETE استخدام شرط WHERE لحذف الصفوف بناءً على شروط محددة، بينما لا يسمح TRUNCATE بالحذف الانتقائي. على سبيل المثال، لحذف مستخدم محدد واحد فقط، يُستخدم DELETE:
DELETE FROM users WHERE id = 1;
بما أن TRUNCATE يزيل دائمًا جميع الصفوف، فإن DELETE أكثر ملاءمة عند الحاجة إلى إزالة بيانات مختارة فقط.
3. تأثير TRUNCATE على AUTO_INCREMENT
إعادة تعيين AUTO_INCREMENT
عند تنفيذ TRUNCATE، لا يتم إزالة جميع بيانات الجدول فحسب، بل يتم إعادة تعيين عداد AUTO_INCREMENT أيضًا. هذا يعني أن البيانات الجديدة ستبدأ مرة أخرى من معرف 1. على سبيل المثال، إذا قمت بإدراج في جدول users بعد التقطيع:
INSERT INTO users (name) VALUES ('Ken');
-- id will start again from 1
بينما يمكن أن تكون هذه الإعادة التعيين مفيدة في بعض الحالات، إلا أن الحذر ضروري إذا كانت المعرفات مستخدمة كمفاتيح خارجية في جداول أخرى، حيث قد يسبب ذلك تناقضات غير متوقعة.
4. الاحتياطات عند استخدام TRUNCATE
لا يمكن استرداد البيانات
أكبر مخاطر TRUNCATE هي أن البيانات المحذوفة لا يمكن استعادتها. تقطيع بيانات مهمة عن طريق الخطأ يعني فقدانًا دائمًا. قم دائمًا بنسخ احتياطي لبياناتك قبل تنفيذ TRUNCATE.
قيود المفاتيح الخارجية
لا يمكن استخدام TRUNCATE على الجداول التي تحتوي على قيود مفاتيح خارجية. في مثل هذه الحالات، يجب إزالة القيود أولاً أو التعامل مع البيانات المتعلقة بوسائل أخرى.
متطلبات الصلاحيات
لتنفيذ TRUNCATE، يجب أن تكون لديك صلاحيات DROP على الجدول. لن يتمكن المستخدمون بدون صلاحيات كافية من تشغيل هذا الأمر، لذا تحقق من صلاحياتك مسبقًا.

5. متى يُستخدم TRUNCATE مقابل DELETE
متى يُستخدم TRUNCATE
TRUNCATE هو الأفضل عندما تحتاج إلى مسح جدول كامل دفعة واحدة. إنه مفيد بشكل خاص عندما تحتاج إلى إزالة جميع الصفوف بسرعة وإعادة تعيين AUTO_INCREMENT، مثل عند تحديث بيانات الاختبار.
متى تستخدم DELETE
يجب استخدام DELETE عندما تحتاج إلى إزالة صفوف انتقائية أو عندما يجب تشغيل الـ triggers. إنه أكثر ملاءمة عندما تريد إزالة البيانات بأمان تحت شروط معينة مع الحفاظ على اتساق قاعدة البيانات.
6. أفضل الممارسات لاستخدام TRUNCATE بأمان
أهمية النسخ الاحتياطي
قبل تشغيل TRUNCATE، قم دائمًا بإنشاء نسخة احتياطية لبياناتك. فقدان البيانات من التنفيذ العرضي غير قابل للعكس، لذا يلزم الحذر الإضافي في بيئات الإنتاج.
الاختبار في بيئة التطوير
اختبر دائمًا TRUNCATE في بيئة staging أو تطوير قبل استخدامه في الإنتاج. هذا يضمن أنه يتصرف كما هو متوقع ويمنع المشكلات غير المتوقعة.
إدارة أعمدة AUTO_INCREMENT
بما أن TRUNCATE يعيد تعيين AUTO_INCREMENT، تحقق من أن المعرفات الفريدة والعلاقات مع الجداول الأخرى لن تتعطل. قم دائمًا بنسخ احتياطي ومراجعة التبعيات قبل تشغيل TRUNCATE في الأنظمة الحرجة.


