View Full Version : مرتب کردن رکورد های بهم ریخته
Restlesa
دوشنبه 03 خرداد 1395, 23:05 عصر
سلام
فرض کنید جدولی داریم با فیلد های id - name - family که فیلد id از نوع int و Auto Increment هستش.
همون طور که خودتونم می دونید زمانی که داده هایی رو در این جدول درج می کنیم مقدار id بصورت خودکار از عدد یک شروع به افزایش می کنه
حال فرض کنید که تعدادی رکورد ایجاد و حذف کردیم و داده هایی که در جدول موجود هستن به شکل زیرن:
1 - محمد - یزدیان
2 - علی رضا - محمودی
5 - علی - رسولی
8 - پدرام - نبویان
9 - سیما - وحیدی
.
.
.
همون طور که می بینید رکورد های 3 - 4 - 6 - 7 - 10 حذف شده اند
حال سوال من اینه که با چه دستور یا روشی جدول فوق رو طوری ویرایش کنم که 5 رکورد با id های 1 تا 5 داشته باشم ؟؟؟
parsdarab
سه شنبه 04 خرداد 1395, 12:09 عصر
سلام
منظورت اینه که فیلد Id رو ویرایش کنی؟
یا اینکه یه فیلد محاساباتی ایجاد کنی که به ازاری هر رکورد شماره بیفته؟
اگه این رو برای ردیف در سطح برنامه میخای راهش چیز دیگس
Mahmood_M
سه شنبه 04 خرداد 1395, 12:16 عصر
فیلد ID رو نمی تونید تغییر بدید و منطقی هم نیست تغییر دادنش
می تونید یک فیلد به عنوان شماره ردیف درنظر بگیرید و اون رو برای مرتب سازی ویرایش کنید
یک متغیر با مقدار اولیه 0 تعریف کنید و به صورت زیر جدول رو Update کنید :
DECLARE @MyVar INT
SET @MyVar = 0
UPDATE MyTable SET @MyVar = MyField = @MyVar + 1 Where ...
سوال مشابه (http://barnamenevis.org/showthread.php?368863-%D9%85%D9%82%D8%AF%D8%A7%D8%B1-%D8%AF%D9%87%DB%8C-%D8%A8%D9%87-%DB%8C%DA%A9-%D9%81%DB%8C%D9%84%D8%AF-%D8%AF%D8%B1-%D8%B1%DA%A9%D9%88%D8%B1%D8%AF-%D9%87%D8%A7%DB%8C-%D8%AC%D8%AF%D9%88%D9%84-%D8%A8%D9%87-%D8%B5%D9%88%D8%B1%D8%AA-%D8%B9%D8%AF%D8%AF-%D8%A7%D9%81%D8%B2%D8%A7%DB%8C%D8%B4%DB%8C)
Restlesa
پنج شنبه 06 خرداد 1395, 00:56 صبح
ممنون از جواب هاتون ولی سوال من رو درست متوجه نشدین
سوالم رو جور دیگه ای می پرسم
جدولی رو در نظر بگیرید که نوع داده ای فیلد id از نوع TINYINT و unsigned باشه. و اون جدول دارای 100 رکرود باشه و رکورد آخر نیز id=255 هستش
حالا اگر بخوایم رکورد 101 رو اضافه کنیم با پیغام خطا مواجع میشم که میگه بیشتر از طول نوع داده ای انتخاب شده (یعنی 255 رکورد) نمی تونیم رکوردی رو ایجاد کنیم. در صورتی که جدول ما 100 رکورد داره
شما دوستان گرامی برای برطرف کردن این مشکل چه راه حلی دارین ؟؟؟
راه حلی که من به ذهنم میرسه اینه که با استفاده از دستور COUNT تعداد رکوردهای موجود جدول رو بگیریم و با یه حلقه for مقدار فیلد id رو از ۱ تا COUNT به روز کنیم.
آیا این راه حل مناسبی هست ؟؟؟
Mahmood_M
پنج شنبه 06 خرداد 1395, 01:23 صبح
ممنون از جواب هاتون ولی سوال من رو درست متوجه نشدین
سوالم رو جور دیگه ای می پرسم
سوالی که در ابتدا پرسیدید کاملا متفاوت بود !
به هر حال ...
جدولی رو در نظر بگیرید که نوع داده ای فیلد id از نوع TINYINT و unsigned باشه. و اون جدول دارای 100 رکرود باشه و رکورد آخر نیز id=255 هستش
حالا اگر بخوایم رکورد 101 رو اضافه کنیم با پیغام خطا مواجع میشم که میگه بیشتر از طول نوع داده ای انتخاب شده (یعنی 255 رکورد) نمی تونیم رکوردی رو ایجاد کنیم. در صورتی که جدول ما 100 رکورد داره
نمی تونید مقدار فیلد ID رو تغییر بدید و تغییر دادنش کار منطقی ای نیست
منظور از اون پیغام این نیست که نمی تونید بیش از 255 رکورد ثبت کنید، بلکه مشکل از اونجایی پیش میاد که نوع داده ای TINYINT حداکثر تا عدد 255 رو می تونه در خودش نگه داره و مقدار عددی بیشتر از 255 به فضای بیشتری برای ذخیره سازی نیاز داره
برای فیلد ID طول بیشتری درنظر بگیرید، مثلا INT یا BIGINT ، چه مشکلی وجود داره ؟
راه حلی که من به ذهنم میرسه اینه که با استفاده از دستور COUNT تعداد رکوردهای موجود جدول رو بگیریم و با یه حلقه for مقدار فیلد id رو از ۱ تا COUNT به روز کنیم.
آیا این راه حل مناسبی هست ؟؟؟
امکانش نیست که مقدار فیلد AutoInc رو تغییر بدید
راه حل ثبت مقادیر هم حلقه For نیست، اگر قصد مرتب سازی دارید یک فیلد جداگانه براش درنظر بگیرید و به همون روشی که در پست قبل گفتم جدول رو UPDATE کنید
Restlesa
شنبه 08 خرداد 1395, 14:20 عصر
نمی تونید مقدار فیلد ID رو تغییر بدید و تغییر دادنش کار منطقی ای نیست
برچه اساسی این حرف رو می زنید دوست عزیز ؟؟؟
منظور از اون پیغام این نیست که نمی تونید بیش از 255 رکورد ثبت کنید، بلکه مشکل از اونجایی پیش میاد که نوع داده ای TINYINT حداکثر تا عدد 255 رو می تونه در خودش نگه داره و مقدار عددی بیشتر از 255 به فضای بیشتری برای ذخیره سازی نیاز داره
وقتی نمی تونه عددی بیشتر از 255 رو قبول کنه پس حداکثر تعداد رکوردی که خواهیم داشت 255 رکورد خواهد بود.
برای فیلد ID طول بیشتری درنظر بگیرید، مثلا INT یا BIGINT ، چه مشکلی وجود داره ؟
وقتی قرار نیست بیشتر از 255 رکورد داشته باشم برای چی بی خودی از نوع INT و BIGINT استفاده کنم و حجم دیتابیس رو بالا ببرم؟؟؟
Mahmood_M
یک شنبه 09 خرداد 1395, 12:05 عصر
به جای اینکه موضع بگیرید، لطفا کمی جستجو کنید
وقتی فیلد رو از نوع Auto قرار دادید یعنی مقدارش به صورت خودکار ساخته میشه و ساخت مقدار جدیدش توسط خود بانک اطلاعاتی انجام میشه
طبیعیه که نباید امکان Update این فیلد وجود داشته باشه
راه های تغییر این فیلد راه های معمولی نیستند، مثلا می تونید یک جدول جدا بسازید و اطلاعات رو انتقال بدید به جدول جدید با ID جدید و جدول قبلی رو حذف کنید
یا در یک جدول موقت بریزید، Update کنید بعد به جدول قبلی برگردونید
یا مثلا می تونید مقادیر فیلد ID رو با ترفندی شیفت بدید به مقادیر بالاتر
اما نمی تونید مرتب سازی کنید و به صورت دلخواه مقادیر رو تغییر بدید
وقتی قرار نیست بیشتر از 255 رکورد داشته باشم برای چی بی خودی از نوع INT و BIGINT استفاده کنم و حجم دیتابیس رو بالا ببرم؟؟؟
چون فیلد ID مقادیرش ربطی به تعداد رکوردها نداره، دلیلش هم اینه که فیلد ID با حذف اطلاعات Reset نمیشه، حداکثر مقدار فیلد ID میشه مجموع تعداد کل رکوردهای ثبت شده و حذف شده که از تعداد رکودهای موجود در جدول حتما بیشتره
تفاوت نوع INT و TINYINT تعداد 3 بایت هستش، تعداد رکوردها هم که می گید حداکثر 255 تا خواهد بود، تفاوت حجم دیتابیس شما از 1 یا 2 کیلوبایت تجاوز نمی کنه، و مشکل حجم عملا وجود نداره
اگر تعداد 255 رکورد ثابت دارید، خوب می تونید از TINYINT استفاده کنید، اما اگر رکوردها ثابت نیستند و حذف میشن، باید فضایی بیشتر از مقدار 255 براش درنظر بگیرید
اگر اسرار دارید که TINYINT باشه، باید از روشهای غیر معمولی مثل ثبت در جدول جدید و یا شیفت مقادیر استفاده کنید که البته شیفت دادن هم با توجه به مشکل شما مناسب نیست
یعنی هر بار که اطلاعات حذف شد بیاید یک جدول Temp بسازید، اطلاعات رو داخلش بریزید و Update کنید و بعد انتقال بدید
نکته مهم اینکه وقتی اصرار دارید نوع TINYINT باشه و رکوردها هم ثابت نیستند و حذف میشن، چرا از فیلد AutoIncrement استفاده می کنید ؟
یک فیلد معمولی بسازید از نوع TINYINT و بعد از تغییر اطلاعات اون رو به صورت افزایشی مقداردهی کنید ( روشی که در پست های قبلی قرار دادم )
روشهای دیگه ای هم هست مثل ساخت فیلد ID معمولی و استفاده از SEQUENCE برای مقدار Default فیلد ( در SQLServer 2012 ) که البته فکر نمی کنم مشکل مطرح شده رو حل کنه
به هر حال، موفق باشید ...
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.