PDA

View Full Version : خطا در استفاده از TRUNCATE TABLE



fakhravari
دوشنبه 20 شهریور 1391, 20:00 عصر
با سلام
TRUNCATE TABLE News_Cities
چرا جداول بعضی اوقاط خطا کلید میدهد
because it is being referenced by a FOREIGN KEY constraint.
در صورتی که من از ID استفاده نمی کنم در جایی:متفکر:

حامد مصافی
دوشنبه 20 شهریور 1391, 20:45 عصر
دیاگرام هم وصل نکرده‌اید؟

fakhravari
دوشنبه 20 شهریور 1391, 20:49 عصر
چرا دیاگرام داره

حامد مصافی
دوشنبه 20 شهریور 1391, 21:36 عصر
وقتی دیاگرام ایجاد می‌کنید کلید‌های خارجی متناظر آنها به صورت خودکار ایجاد می‌شوند.

fakhravari
سه شنبه 21 شهریور 1391, 02:01 صبح
خب درست .
راهکار چی هست.
به هر حال دیاگرام لازم است .
چون تعجب من اینه که کلیدی در جدولی استفاده نشده که نتونه حذفش کنه.:ناراحت:

حمیدرضاصادقیان
سه شنبه 21 شهریور 1391, 08:16 صبح
سلام.
شما وقتی دارید از Foreign key استفاده میکنید نمیتوانید از دستور Truncate استفاده کنید. دوکار میتوانید انجام دهید.
یا با استفاده از دستور Alter ابتدا Foreign key رو حذف کرده بعد دستور Truncate رو اجرا کنید.
یا اینکه از دستور Delete استفاده کرده و اگر یکی از فیلدهاتون از نوع Identity هست با استفاده از دستورات DBCC ChekIdent مقدار اونو Reset کنید.

fakhravari
پنج شنبه 23 شهریور 1391, 12:16 عصر
برای تکمیل پست.
معرفی دستور DELETE:

با این دستور حتما آشنا هستید. این دستور استاندارد جهت حذف اطلاعات (یا به عبارت درست تر، داده ها) از یک جدول استفاده می شود.
کاربرد این دستور معمولا به دو شکل زیر می باشد.

1. DELETE FROM MyTable
2. DELETE FROM MyTable WHERE ID < 100


در کاربرد نوع اول، تمام داده های موجود در جدول MyTable حذف شده و در دستور دوم فقط داده هایی حذف می شوند که شرط مورد نظر در مورد آن ها برقرار باشد.
معرفی دستور TRUNCATE:

دستور TRUNCATE یک دستور غیر استاندارد می باشد که جهت حذف تمامی داده های موجود در جدول استفاده می شود.
کاربرد این دستور به شکل زیر می باشد.
TRUNCATE TABLE MyTable

مقایسه دستورات DELETE و TRUNCATE:



دستور TRUNCATE بر خلاف دستور DELETE نمی تواند دارای شرط باشد. به عبارت دیگر شما نمی توانید عبارت WHERE را همراه این دستور بکار ببرید.
دستور TRUNCATE به صورت کمینه (Minimally) لاگ می شود در حالیکه دستور DELETE به صورت کامل لاگ می شود. بنابراین دستور TRUNCATE بسیار سریع تر از دستور DELETE عمل می کند. به طوریکه اگر جدول مورد نظر شامل میلیون ها رکورد باشد، با استفاده از دستور TRUNCATE ظرف چند ثانیه کل داده ها حذف می شوند در صورتی که با استفاده از دستور DELETE این عمل می تواند دقیقه ها و حتی ساعت ها طول بکشد.
اگر جدول ما حاوی فیلدی از نوع Identity باشد، پس از اجرای دستور TRUNCATE مقدار این فیلد Reset شده و به مقدار اولیه خود برمی گردد، در حالی که در مورد دستور DELETE چنین نیست.
اگر جدولی که قصد داریم داده های آن را حذف کنیم، توسط جداول دیگر ارجاع گرفته شده باشد یعنی فیلد کلید اصلی این جدول در جداول دیگری به عنوان کلید خارجی مورد استفاده قرار گرفته باشد، دیگر نمی توان از دستور TRUNCATE جهت حذف داده های این جدول استفاده نمود. حتی اگر جداول دیگر خالی بوده باشند و یا حتی اگر کلید های خارجی را غیر فعال (Disable) کنیم، باز هم نمی توانیم از دستور TRUNCATE استفاده کنیم و حتما باید روابط (Relations) را حذف کنیم تا بتوانیم از این دستور استفاده بکنیم. به طور مثال اگر جداول Order و OrderDetais را در نظر بگیریم، تا زمانی که بین این دو جدول رابطه وجود دارد، نمی توان دستور TRUNCATE رو روی جدول Order اجرا نمود.

تذکر مهم:

با توجه به اینکه دستور TRUNCATE بسیار سریع می باشد، میزان خطر آن به اندازه دستور DROP می باشد و استفاده اشتباه از آن می تواند منجر به فاجعه شود. بنابراین هنگام استفاده از این دستور دقت کافی را داشته باشید.

hassanzarabi
یک شنبه 21 خرداد 1396, 02:35 صبح
با سلام و خسته نباشید
از جناب آقای مهندس حمیدرضا صادقیان و همچنین جناب آقای fakhravari (http://barnamenevis.org/member.php?128926-fakhravari) از مطالب بسیار مفیدشون واقعا ممنونم
با تشکر