Truncate در لغت به معنی بریدن و کوتاه کردن میباشد. با استفاده دستور Truncate Table میتوانید محتوای کلیه رکوردهای موجود در یک جدول را در کسری از ثانیه حذف کنید.
نکته مهمی که باید درباره دستور Truncate Table بدانید این است که تاثیر استفاده از این دستور بر روی کلیه رکوردها بوده و به هیچ عنوان نمیتوان برای این دستور شرط (Where Clause) اعمال نمود.
شکل کلی استفاده از این دستور به صورت زیر میباشد.
TRUNCATE TABLE table_name
برای مثال اگر بخواهیم کلیه رکوردهای موجود در جدول Customers را حذف نمایید کافی است با استفاده از این دستور اینکار را انجام دهید
TRUNCATE TABLE Customers
با اجرای این دستور در کسری از ثانیه کلیه رکوردهای جدول Customers حذف خواهد شد. (بهتر است از این دستور زمانی استفاده کنید که بخواهید ساختار جدول شما باقی بماند)
اما در مورد دستور Truncate Table و Delete باید به نکات زیر توجه کنید.
۱- دستور Truncate Table فاقد قسمت شرط (Where Clause) میباشد در صورتیکه دستور Delete دارای قسمت شرط (Where Clause) است.
۲- دستور Truncate Table در Log File آدرس Page و مقدار فضای آزاد شده (کمترین میزان Log) را مینویسد اما در صورتیکه دستور Delete در Log هر رکوردی را که قرار است حذف شود را در Log File ثبت مینماید.
۳- دستور Truncate Table باعث میشود که Pageهای متعلق به جدول deallocate شوند. deallocate شدن Pageها این معنی را میدهد که رکوردهای موجود در جدول واقعاً حذف نشوند بلکه Extentهای مربوط به آن Pageها علامت Empty خورده تا دفعات بعد مورد استفاده قرار گیرند اما دستور Delete به طور فیزیکی محتوای Pageها مربوط به جدول را خالی میکند.
نکته : پس از Truncate شدن رکوردها امکان بازگشت آنها وجود ندارد.
۴- در صورتیکه جدول شما دارای ایندکس باشد. دستور Truncate Table آزاد کردن فضای مربوط به ایندکس را در یک مرحله انجام میدهد(مطابق بند ۳) همچنین Log مربوط به این حذف به شکل حداقل (مطابق بند ۲) در Log File ثبت میشود. اما دستور Delete هر رکوردی را که از ایندکس حذف میکند در Log File ثبت می کند.
۵- Trigger مربوط به دستور Delete به هیچ عنوان هنگام اجرای دستور Truncate Table فعال نمیشود. در صورتیکه با اجرای دستور Delete تریگر آن فعال خواهد شد.
۶- در صورتیکه جدول شما دارایRelation) Reference) باشد امکان استفاده از دستور Truncate Table وجود ندارد. لازم به ذکر است حتی اگر Reference را غیر فعال کنید باز هم امکان استفاده از دستور Truncate Table وجود نخواهد داشت و تلاش برای اجرای دستور Truncate Table باعث نمایش خطای زیر خواهد شد.
در صورتیکه در دستور Delete امکان حذف رکوردها به ازای جداولی که دارای Relation هستند وجود دارد. فقط باید به این نکته توجه کنید که ترتیب حذف رکوردها از جداول Master و Detail را رعایت کنید.
۷- دستور Truncate Table مقدار Identity را Reset کرده و آن را به Seed (هسته/مقدار اولیه) بر میگرداند. در صورتیکه دستور Delete تاثیری بر روی مقدار Identity ندارد
۸- دستور Truncate Table تنها توسط کاربرانی قابل اجرا است که نقش DB_Owner و یا SysAdmin را داشته باشند در صورتیکه دستور Delete توسط هر کاربری که مجوز Delete بر روی جدول را داشته باشد قابل اجرا میباشد.
۹- پس از اجرای دستور Truncate Table تعداد رکوردهای حذف شده نمایش داده نمیشود. در صورتیکه هنگام اجرای دستور Delete تعداد رکوردهای حذف شده نمایش داده میشود.
منبع : https://nikamooz.com/truncate-statement-sql/