"

آشنایی با مکانیسم TRUNCATE TABLE در SQL Server,TRUNCATE TABLE چیست؟,مکانیسم TRUNCATE TABLE چگونه است؟

آشنایی با مکانیسم TRUNCATE TABLE در SQL Server

TRUNCATE TABLE در SQL Server برای حذف سریع تمام داده‌های جدول استفاده می‌شود و ساختار جدول و ستون‌های آن را حفظ می‌کند.

تیم تحریریه
5
0
28 مرداد 1405
لینک کوتاه

آشنایی با مکانیسم TRUNCATE TABLE در SQL Server

دستور TRUNCATE TABLE در SQL Server یکی از روش‌های حذف سریع تمامی رکوردهای یک جدول است.
زمانی که هدف شما پاک کردن تمام داده‌های یک جدول باشد و نیازی به حذف تک‌تک رکوردها نداشته باشید، TRUNCATE TABLE می‌تواند انتخاب مناسبی باشد.
البته TRUNCATE TABLE با DELETE تفاوت‌های مهمی دارد و شناخت این تفاوت‌ها برای جلوگیری از حذف ناخواسته اطلاعات ضروری است.
نحوه کار با صفحات داده، رفتار ستون IDENTITY، محدودیت‌های مربوط به Foreign Key و نحوه ثبت عملیات در Transaction Log از جمله مواردی هستند که باید هنگام استفاده از این دستور بدانید.


آشنایی با مکانیسم TRUNCATE TABLE در SQL Server




TRUNCATE TABLE چیست؟

TRUNCATE TABLE یک دستور DDL در SQL Server است که تمام ردیف‌های موجود در یک جدول را حذف می‌کند، اما ساختار خود جدول، ستون‌ها، Indexها و سایر مشخصات جدول را باقی می‌گذارد.
ساختار کلی دستور به شکل زیر است:

TRUNCATE TABLE TableName;
برای مثال، فرض کنید جدولی با نام Employees داریم:

TRUNCATE TABLE Employees;
پس از اجرای این دستور، تمام رکوردهای جدول Employees حذف می‌شوند، اما خود جدول همچنان وجود دارد و می‌توان رکوردهای جدیدی در آن قرار داد.


🌟 آیا می‌خواهید به یک متخصص پایگاه داده تبدیل شوید و در دنیای فناوری اطلاعات بدرخشید؟
با دوره آموزشی SQL Server ما، شما می‌توانید به راحتی و با روشی عملی، تمام مهارت‌های لازم را یاد بگیرید!
این دوره به شما آموزش می‌دهد که چگونه داده‌ها را به بهترین شکل مدیریت کنید، گزارش‌های قدرتمند بسازید و به تحلیل‌های عمیق دست یابید.
با محتوای جذاب و پروژه‌های واقعی، شما نه تنها تئوری را یاد می‌گیرید، بلکه توانایی‌های عملی خود را نیز تقویت می‌کنید.
پس فرصت را از دست ندهید! همین امروز به جمع یادگیرندگان ما بپیوندید و اولین قدم را به سوی آینده شغلی روشن‌تر بردارید!



مثال ساده TRUNCATE TABLE 
در SQL Server


ابتدا یک جدول نمونه ایجاد می‌کنیم:

CREATE TABLE Products
(
    Id INT IDENTITY(1,1) PRIMARY KEY,
    ProductName NVARCHAR(100),
    Price DECIMAL(10,2)
);


چند رکورد به جدول اضافه می‌کنیم:

INSERT INTO Products (ProductName, Price)
VALUES
(N'لپ‌تاپ', 50000000),
(N'موس', 1500000),
(N'کیبورد', 2500000);


برای مشاهده اطلاعات:

SELECT *
FROM Products;

حالا با دستور زیر تمام رکوردها حذف می‌شوند:
TRUNCATE TABLE Products;
در این مرحله، جدول Products همچنان وجود دارد، اما اطلاعات آن پاک شده است.

تفاوت TRUNCATE و DELETE در SQL Server

یکی از سوالات مهم کاربران این است که تفاوت TRUNCATE و DELETE چیست؟
دستور DELETE برای حذف رکوردها استفاده می‌شود:

DELETE FROM Products;
در حالت DELETE می‌توان با استفاده از WHERE فقط رکوردهای مشخصی را حذف کرد:

DELETE FROM Products
WHERE Price < 2000000;

اما TRUNCATE TABLE امکان استفاده از WHERE را ندارد:

TRUNCATE TABLE Products;

این دستور تمام ردیف‌های جدول را حذف می‌کند.
تفاوت مهم دیگر مربوط به نحوه ثبت عملیات حذف و کار با صفحات داده است.
DELETE برای حذف ردیف‌ها به‌صورت رکوردی عمل می‌کند، در حالی که TRUNCATE فضای اختصاص‌یافته به داده‌ها را در سطح صفحات آزاد می‌کند.



تفاوت TRUNCATE و DELETE در SQL Server

TRUNCATE و ستون IDENTITY

یکی از ویژگی‌های مهم TRUNCATE TABLE، رفتار آن با ستون‌های IDENTITY است.
فرض کنید جدول زیر را داشته باشیم:

CREATE TABLE Customers
(
    Id INT IDENTITY(1,1) PRIMARY KEY,
    Name NVARCHAR(100)
);

دو رکورد ایجاد می‌کنیم:

INSERT INTO Customers (Name)
VALUES
(N'Ali'),
(N'Sara');

در این حالت ممکن است شناسه‌ها به شکل زیر باشند:
1
2

حالا:
TRUNCATE TABLE Customers;
داده‌ها حذف می‌شوند و شمارنده IDENTITY نیز به مقدار اولیه بازمی‌گردد.
بنابراین اگر بعد از TRUNCATE دوباره رکوردی اضافه کنیم:
INSERT INTO Customers (Name)
VALUES (N'Reza');

مقدار Id دوباره از مقدار Seed تعریف‌شده شروع خواهد شد.
این رفتار در بسیاری از سناریوهای آزمایشی و توسعه‌ای بسیار مفید است.

آیا TRUNCATE قابل بازگشت است؟

یکی از تصورات اشتباه این است که TRUNCATE TABLE همیشه غیرقابل بازگشت است.
در SQL Server، TRUNCATE TABLE می‌تواند داخل یک Transaction اجرا شود و در صورت Rollback شدن تراکنش، عملیات نیز قابل بازگشت است.
برای مثال:
BEGIN TRANSACTION;
TRUNCATE TABLE Products;
ROLLBACK TRANSACTION;

در این حالت، تغییرات تراکنش برگردانده می‌شوند.
بنابراین قبل از اجرای TRUNCATE در محیط‌های حساس، همچنان باید دقت زیادی داشته باشید؛ زیرا در صورت اجرای آن بدون Transaction مناسب، تمام داده‌های جدول حذف خواهند شد.

آیا TRUNCATE سریع‌تر از DELETE است؟

در بسیاری از سناریوها، بله. دلیل اصلی این موضوع نحوه حذف داده‌هاست.
در DELETE، حذف رکوردها به‌صورت داده‌ای انجام می‌شود و در صورت استفاده از WHERE امکان انتخاب رکوردهای خاص نیز وجود دارد.
اما TRUNCATE TABLE با آزادسازی صفحات داده، عملیات را در سطحی متفاوت انجام می‌دهد.
این موضوع باعث می‌شود هنگام پاک کردن کل جدول، معمولاً هزینه عملیاتی کمتری نسبت به DELETE داشته باشد.
با این حال، سرعت واقعی به شرایط محیط، حجم جدول، ساختار ایندکس‌ها و عوامل دیگر بستگی دارد و نباید فقط بر اساس نام دستور درباره عملکرد تصمیم گرفت.

محدودیت‌های TRUNCATE TABLE در SQL Server

هرچند TRUNCATE TABLE سریع و کاربردی است، اما در همه شرایط قابل استفاده نیست.
یکی از مهم‌ترین محدودیت‌ها مربوط به Foreign Key است.
اگر جدول موردنظر توسط یک Foreign Key در جدول دیگری مورد اشاره قرار گرفته باشد، اجرای TRUNCATE TABLE ممکن است مجاز نباشد.
برای مثال اگر جدول Orders به Customers وابسته باشد:
Orders.CustomerId → Customers.Id
ممکن است نتوانیم جدول Customers را مستقیماً Truncate کنیم، مگر اینکه وابستگی‌های مربوطه مدیریت شوند.
در چنین شرایطی معمولاً DELETE گزینه انعطاف‌پذیرتری است.


محدودیت‌های TRUNCATE TABLE در SQL Server

TRUNCATE و WHERE

یکی از تفاوت‌های بسیار مهم TRUNCATE TABLE با DELETE این است که TRUNCATE از WHERE پشتیبانی نمی‌کند.
این دستور صحیح است:
DELETE FROM Employees
WHERE Id = 10;

اما دستور زیر صحیح نیست:
TRUNCATE TABLE Employees
WHERE Id = 10;

زیرا TRUNCATE TABLE برای پاک کردن تمام داده‌های جدول طراحی شده است.
اگر فقط بخشی از رکوردها باید حذف شوند، از DELETE استفاده کنید.

چه زمانی از TRUNCATE استفاده کنیم؟

استفاده از TRUNCATE TABLE در شرایط مختلفی می‌تواند منطقی باشد.
برای مثال در محیط توسعه، ممکن است جدول آزمایشی شما هزاران رکورد داشته باشد و بخواهید قبل از اجرای تست جدید تمام داده‌ها را پاک کنید.
در چنین وضعیتی:

TRUNCATE TABLE TestResults;

ساده‌تر از حذف تمام رکوردها با DELETE خواهد بود.
همچنین برای پاک‌سازی موقت جداولی که داده‌های آن‌ها دوباره تولید می‌شوند، این دستور می‌تواند گزینه مناسبی باشد.

چه زمانی از DELETE استفاده کنیم؟

اگر فقط بخشی از داده‌ها را می‌خواهید حذف کنید، باید از DELETE استفاده کنید.
برای مثال:
DELETE FROM Orders
WHERE OrderDate < '2024-01-01';

همچنین زمانی که جدول با محدودیت‌های خاصی مانند وابستگی‌های Foreign Key مواجه است، DELETE ممکن است گزینه عملی‌تری باشد.

TRUNCATE در برابر DROP TABLE

TRUNCATE TABLE را نباید با DROP TABLE اشتباه گرفت.
در TRUNCATE فقط داده‌های جدول حذف می‌شوند و ساختار جدول باقی می‌ماند:

TRUNCATE TABLE Products;

اما در DROP TABLE خود جدول نیز حذف می‌شود:

DROP TABLE Products;
بعد از اجرای DROP TABLE دیگر جدول Products وجود نخواهد داشت و برای استفاده دوباره باید آن را ایجاد کنید.
بنابراین:
TRUNCATE → حذف داده‌ها، حفظ ساختار جدول
DELETE   → حذف رکوردها، حفظ ساختار جدول
DROP     → حذف خود جدول

نکات مهم قبل از اجرای TRUNCATE

قبل از استفاده از TRUNCATE TABLE بهتر است چند نکته را بررسی کنید.
اول مطمئن شوید که جدول صحیح را انتخاب کرده‌اید:
SELECT DB_NAME();

سپس می‌توانید تعداد رکوردهای موجود را ببینید:
SELECT COUNT(*) AS TotalRows
FROM Products;

بعد از آن، در صورت حساس بودن اطلاعات، نسخه پشتیبان مناسب تهیه کنید.
همچنین اگر داده‌ها در محیط Production قرار دارند، قبل از اجرای دستور باید وابستگی‌های جدول و اهمیت داده‌ها را بررسی کنید.

یک مثال کاربردی کامل از  TRUNCATE

فرض کنید جدولی برای ثبت لاگ‌های موقت داریم:
CREATE TABLE Logs
(
    Id INT IDENTITY(1,1) PRIMARY KEY,
    Message NVARCHAR(500),
    CreatedAt DATETIME2 DEFAULT SYSDATETIME()
);

اکنون چند رکورد اضافه می‌کنیم:
INSERT INTO Logs (Message)
VALUES
(N'شروع برنامه'),
(N'اتصال به دیتابیس'),
(N'پایان پردازش');

برای مشاهده تعداد رکوردها:
SELECT COUNT(*) AS TotalRows
FROM Logs;

حالا تمام داده‌ها را پاک می‌کنیم:
TRUNCATE TABLE Logs;
پس از اجرای دستور:
SELECT COUNT(*) AS TotalRows
FROM Logs;

تعداد رکوردها صفر خواهد بود، اما جدول Logs همچنان قابل استفاده است.

جمع‌بندی

TRUNCATE TABLE در SQL Server دستوری قدرتمند برای حذف سریع تمام رکوردهای یک جدول است، بدون اینکه ساختار جدول حذف شود.
این دستور در سناریوهایی که قصد دارید کل داده‌های یک جدول را پاک کنید، گزینه‌ای مناسب محسوب می‌شود.
مهم‌ترین ویژگی‌های TRUNCATE TABLE شامل حذف تمام رکوردها، عدم پشتیبانی از WHERE، عملکرد مناسب برای پاک‌سازی کامل جدول و بازنشانی شمارنده IDENTITY است.
در مقابل، DELETE امکان حذف انتخابی رکوردها را فراهم می‌کند و DROP TABLE خود ساختار جدول را نیز از بین می‌برد.
بنابراین انتخاب بین این دستورات باید بر اساس نیاز واقعی پروژه انجام شود.
اگر فقط چند رکورد مشخص باید حذف شوند، DELETE گزینه مناسب‌تری است؛ اگر تمام داده‌ها باید پاک شوند و ساختار جدول باید باقی بماند، TRUNCATE TABLE می‌تواند انتخاب بهتری باشد؛ و اگر دیگر به خود جدول نیاز ندارید، DROP TABLE کاربرد دارد.

سوالات متداول درباره TRUNCATE TABLE

آیا TRUNCATE تمام اطلاعات جدول را حذف می‌کند؟

بله، TRUNCATE TABLE تمام ردیف‌های جدول را حذف می‌کند، اما ساختار جدول باقی می‌ماند.

آیا می‌توان از WHERE در TRUNCATE استفاده کرد؟

خیر. TRUNCATE TABLE امکان حذف انتخابی رکوردها با WHERE را ندارد.

آیا TRUNCATE مقدار IDENTITY را ریست می‌کند؟

بله، هنگام Truncate شدن جدول، شمارنده Identity به Seed اولیه بازمی‌گردد.

TRUNCATE بهتر است یا DELETE؟

برای حذف تمام داده‌های یک جدول، TRUNCATE در بسیاری از شرایط کارآمدتر است؛ اما برای حذف بخشی از رکوردها باید از DELETE استفاده شود.

آیا TRUNCATE قابل Rollback است؟

در SQL Server می‌توان TRUNCATE TABLE را داخل Transaction اجرا کرد و با ROLLBACK تغییرات تراکنش را برگرداند.

آیا TRUNCATE ساختار جدول را حذف می‌کند؟

خیر. ستون‌ها، ساختار جدول و Indexها باقی می‌مانند و فقط داده‌های جدول حذف می‌شوند.

محصولات مرتبط

کاربران ما

شما هم نظرتون با ما دریاره “آشنایی با مکانیسم TRUNCATE TABLE در SQL Server” اشتراک بزارید

برای ارسال نظر لطفا ورود یا ثبت نام کنید

منو