PDA

View Full Version : سوال: یک کد php برای مرتب کردن AUTO_INCREMENT در یک تابل



mamimami
شنبه 16 مرداد 1389, 17:50 عصر
با سلام
لطفا کمکم کنید.
من یه کد یا یک اسکریپت php میخوام که به وسیله اون بتونم در دیتابیس و در یک تابل AUTO_INCREMENT اون تابل رو که نامنظم هست مثلا از 1 شروع شده تا 2000 و در این مابین مثلا 45 یا 1263 یا .... حذف شده و من میخوام که این تابل AUTO_INCREMENT اون از یک مرتب بشه تا آخرین.
اگه منظورمو نفهمیدین بگین بیشتر توضیح بدم.
مرسی از کمکتون.

LORD AELX
شنبه 16 مرداد 1389, 20:02 عصر
از این کد استفاده کنید:


$arr_query = mysql_query("SELECT * FROM mytable");
for($i = 1; $i < ($arr_row = mysql_fetch_array($arr_query)); $i++){
mysql_query("UPDATE mytable SET ID = ".$i." WHERE ID = ".$arr_row['ID']."");
}

LORD AELX
شنبه 16 مرداد 1389, 20:34 عصر
قبول دارم روش بالا برای جداول حجیم و سنگین کمی غیر منطقی هست و بار پردازشی زیادی می بره... اجازه بدید مشکل رو کامل بررسی کنیم و من برای هر قسمت، راه حلی رو که میدونم به شما بگم...

متن زیر ترجمه ای آزاد از مقاله MySQL: Reset Auto Increament Number (http://www.liewcf.com/mysql-reset-auto-increament-number-115/) می باشد:

ببینید، وقتی فیلد id یک جدول خصوصیت AUTO_INCREMENT داره، موقع تغییرات دو تا مشکل بوجود می آید: اولا هر رکوردی که حذف می شود باعث نا منظم شدن ترتیب شماره id ها می شود و ثانیا وقتی که می خواهیم به چنین جدولی، رکوردی را اضافه کنیم، شماره فیلد id آن یکی بیشتر از شماره فیلد id آخرین رکوردی خواهد بود که وجود دارد یا وجود داشته!! :گیج: :متفکر:

خوب، در درجه اول فرض می کنیم ما 10 تا رکورد داشتیم با شماره id های 1 تا 10 و آمدیم رکورد شماره 9 رو پاک کردیم. حالا اگر رکوردی اضافه کنیم، id آن برابر 11 می شود نه 9 ! برای حل این مشکل باید مقدار AUTO_INCREMENT را به این شکل reset کنیم:


ALTER TABLE tablename AUTO_INCREMENT = 1


اجرای این query باعث می شود مقدار AUTO_INCREMENT بعدی یکی بیشتر از مقدار بزرگترین AUTO_INCREMENT موجود باشد. پس اگر به این جدول رکورد دیگری اضافه شود، مقدار id آن 9 خواهد بود.

حالا فرض می کنیم همان 10 رکورد را داریم ولی این بار رکوردهای وسطی را حذف کرده ایم (چهارمی و پنجمی). میخواهیم رکورد بعدی شماره 4 داشته باشد نه 11. برای حل این مشکل نیز، query زیر را استفاده می کنیم:


SET insert_id = 4;
INSERT INTO tablename VALUES ('blah', '...');


دستور SET insert_id شماره AUTO_INCREMENT بعدی را که insert می کنید، مشخص می کند. (فقط و فقط رکورد insert شده بعدی)

---------------------------------------------------------------

** خود من این رو تست کردم ولی عمل نمی کرد ولی توی وب تقریبا همه یا این رو نوشته بودند یا روش پست قبل رو. یکی که تجربه اش بیشتره لطف کنه اشکال کار رو بگه چون خوانندگان این مقاله هم بعضی هاشون نتیجه نگرفته بودند. من هم بدم نمیاد اینو بدونم، درسته که کلا مطلب مهمی نیست و نیاز حتمی به این مرتب سازی نیست (چون میشه با روش های دیگه هر کاری رو انجام داد) ولی خوب، بد نیست که اگر روش دیگری غیر از پست بالا هست، بدونیم چون ممکنه یه جا به کارمون بیاد.

با تشکر و موفق باشید :بوس: :قلب:

bestirani2
شنبه 16 مرداد 1389, 20:40 عصر
با سلام
لطفا کمکم کنید.
من یه کد یا یک اسکریپت php میخوام که به وسیله اون بتونم در دیتابیس و در یک تابل AUTO_INCREMENT اون تابل رو که نامنظم هست مثلا از 1 شروع شده تا 2000 و در این مابین مثلا 45 یا 1263 یا .... حذف شده و من میخوام که این تابل AUTO_INCREMENT اون از یک مرتب بشه تا آخرین.
اگه منظورمو نفهمیدین بگین بیشتر توضیح بدم.
مرسی از کمکتون.
من یک کلمه هم نفهمیدم
تابل چیه دیگه؟

yasgig
شنبه 16 مرداد 1389, 21:42 عصر
تابل چیه دیگه؟
منظورشون table هست.

bestirani2
شنبه 16 مرداد 1389, 22:11 عصر
هر وقت یک تیبل رو حذف میکنی، شماره مربوط به اون را وارد یک تیبل دیگه بکن که هر وقت خواستی اطلاعات جدید رو باز کنی در صورت اینکه مقداری در تیبل دوم بود، آن را وارد کنی و سپس آن مقدار را از تیبل دوم پاک کنی

یا میتوانی وقتی یکی را پاک میکینی یک کوئری بنویسی که هر کی آیدیش از اون بزرگتر هست یک دونه ازش کم بشه و سپس شماره آخرین آیدی رو قبل از این عمل رو وارد تیبل دوم کنی و مقدار بعدی را که میخواهی وارد کنی را با این آی دی وارد کنی

xoogle.ir
شنبه 16 مرداد 1389, 23:26 عصر
از این کد استفاده کنید:


$arr_query = mysql_query("SELECT * FROM mytable");
for($i = 1; $i < ($arr_row = mysql_fetch_array($arr_query)); $i++){
mysql_query("UPDATE mytable SET ID = ".$i." WHERE ID = ".$arr_row['ID']."");
}


یکی از بزرگترین مشکلات این کد اینه که اگه از این آیدی در جداول دیگه به عنوان کلید خارجی استفاده شده باشه ارتباط بین جداول از بین میره.
به نظر من که اصلا نیازی به مرتب سازی آیدی ها نیست !!
چه کاریه خب :لبخند:

mamimami
یک شنبه 17 مرداد 1389, 00:47 صبح
دوستان دستتون درد نکنه.
تست میکنم جواب داد خبرشو میدم. :قلب::قلب::قلب::قلب:

mamimami
یک شنبه 17 مرداد 1389, 13:41 عصر
دوستان این کد اولی که LORD AELX معرفی کرد فوق العاده هست.
میبوسمت 1000 تا :قلب: :قلب::قلب::قلب::قلب::قلب::قلب:

bestirani2
یک شنبه 17 مرداد 1389, 14:19 عصر
دوستان این کد اولی که LORD AELX معرفی کرد فوق العاده هست.
میبوسمت 1000 تا :قلب: :قلب::قلب::قلب::قلب::قلب::قلب:

این کد فشار فوق العلاده ای به سرور میاره
فکر کن 100 هزار رکور باشه
100 هزار بار تو کوئری میفرستی به بانک اطلاعاتی

برای تسریع این کار باید با یک کوئری این کار رو انجام بدی

LORD AELX
دوشنبه 18 مرداد 1389, 00:37 صبح
همون اول هم گفتم که این کار به چند دلیل منطقی نیست! :متفکر: اول به خاطر بار پردازشی زیاد مخصوصا موقعی که تعداد رکورد ها زیاد باشه و دوم به این خاطر که اگر id یک Primary Key باشه، ارتباط بین جداول از دست میره!! :لبخندساده:

حالا من نمیدونم چرا شما می خواهید از این روش مرتب سازی استفاده کنید و حتما توالی رو حفظ کنید، ولی این کار معمول نیست. حداقل برای من که تا حالا پیش نیامده که به چنین چیزی نیاز پیدا کنم. مثلا اگر بخواهید در خروجی یک شماره رکورد چاپ کنید (شماره تعداد، نه id)، خوب این کار رو میشه به روش های دیگر انجام داد، چرا داده های دیتابیس رو دستکاری می کنید! و ... و ... و ...

به هر حال تصمیم با شماست... :بوس:

LORD AELX
دوشنبه 18 مرداد 1389, 00:43 صبح
این کد فشار فوق العلاده ای به سرور میاره
فکر کن 100 هزار رکور باشه
100 هزار بار تو کوئری میفرستی به بانک اطلاعاتی

برای تسریع این کار باید با یک کوئری این کار رو انجام بدی

این کار چه با اون کد PHP انجام بشه چه با یک Query از لحاظ بار پردازشی تفاوت زیادی با هم نداره. به هر حال این روش برای جداول بزرگ پیشنهاد نمیشه... :چشمک:

حالا بچه ها، کسی راجع به پست دوم من تو تاپیک نظری نداره؟! ظاهرا به طریقی باید کار کنه!! :متفکر:

bestirani2
دوشنبه 18 مرداد 1389, 01:22 صبح
این کار چه با اون کد PHP انجام بشه چه با یک Query از لحاظ بار پردازشی تفاوت زیادی با هم نداره. به هر حال این روش برای جداول بزرگ پیشنهاد نمیشه... :چشمک:

حالا بچه ها، کسی راجع به پست دوم من تو تاپیک نظری نداره؟! ظاهرا به طریقی باید کار کنه!! :متفکر:

اینطور نیست
100% تفاوت فاحش وجود داره

مثال بزنم

شما 1000 تا قبص دارید که میخواهید پرداخت کنید

قبض ها رو دونه دونه ببرید بانک پرداخت کنید بهتر هست یا اینکه 1000 قبض را یکباره ببرید و پرداخت کنید؟

LORD AELX
سه شنبه 19 مرداد 1389, 09:46 صبح
اینطور نیست
100% تفاوت فاحش وجود داره

مثال بزنم

شما 1000 تا قبص دارید که میخواهید پرداخت کنید

قبض ها رو دونه دونه ببرید بانک پرداخت کنید بهتر هست یا اینکه 1000 قبض را یکباره ببرید و پرداخت کنید؟

چرا فکر می کنید اگر با خود SQL این کار انجام بشه، همه رکورد ها یکباره پردازش می شوند؟! :متفکر: مگر کامپیوتر کوانتومی هستش؟؟ :لبخندساده: در نهایت هر کدوم از این روش ها از یک حلقه استفاده می کنند و دونه دونه کار را انجام می دهند. شاید فرق داشته باشند ولی این تفاوت چندان فاحش نیست و خیلی خیلی کم هستش... تنها تفاوت اینه که ما بجای اینکه قبض هامون رو یکدفعه به دوستمون بدهیم تا برود پرداخت کند، دونه دونه این کار رو انجام بدهیم. (با فرض اینکه به تعداد کافی دوست در کنارمون هست!) :لبخند: فرق در یک زمان اتلافی بسیار بسیار ناچیز هستش و بس!! :لبخندساده:

bestirani2
سه شنبه 19 مرداد 1389, 10:59 صبح
چرا فکر می کنید اگر با خود SQL این کار انجام بشه، همه رکورد ها یکباره پردازش می شوند؟! :متفکر: مگر کامپیوتر کوانتومی هستش؟؟ :لبخندساده: در نهایت هر کدوم از این روش ها از یک حلقه استفاده می کنند و دونه دونه کار را انجام می دهند. شاید فرق داشته باشند ولی این تفاوت چندان فاحش نیست و خیلی خیلی کم هستش... تنها تفاوت اینه که ما بجای اینکه قبض هامون رو یکدفعه به دوستمون بدهیم تا برود پرداخت کند، دونه دونه این کار رو انجام بدهیم. (با فرض اینکه به تعداد کافی دوست در کنارمون هست!) :لبخند: فرق در یک زمان اتلافی بسیار بسیار ناچیز هستش و بس!! :لبخندساده:

پی اچ پی و ما اس کیو ال دو محیط جدا هستند
مثل بانک و خانه
فکر کن تا بانک 5 دقیقه وقت هست، اگه یک بار بره دوستت 5 قبض ها پرداخت شده
ولی دونه ای 5 دقیقه رفت و 5 دقیقه برگشت که میشه 10 دقیقه که ضرب در 1000 میشه کلی

یک چیز دیگری هم هست، در این بین ممکنه یکی از کوئری ها که دونه دونه میفرستی به مشکل بر بخوره و در صورتی که از تراکنش استفاده نکیردی، نتیجه ای که میگیری نتیجه مناسبی نیست (این چیزها رو شاید روی لوکال فرقی نکنه ولی وقتی روی سرور بردی و 10 تا کاربر همزمان خواستند اون کار رو بکنند متوجه میشی.)

LORD AELX
سه شنبه 19 مرداد 1389, 20:02 عصر
پی اچ پی و ما اس کیو ال دو محیط جدا هستند
مثل بانک و خانه
فکر کن تا بانک 5 دقیقه وقت هست، اگه یک بار بره دوستت 5 قبض ها پرداخت شده
ولی دونه ای 5 دقیقه رفت و 5 دقیقه برگشت که میشه 10 دقیقه که ضرب در 1000 میشه کلی

یک چیز دیگری هم هست، در این بین ممکنه یکی از کوئری ها که دونه دونه میفرستی به مشکل بر بخوره و در صورتی که از تراکنش استفاده نکیردی، نتیجه ای که میگیری نتیجه مناسبی نیست (این چیزها رو شاید روی لوکال فرقی نکنه ولی وقتی روی سرور بردی و 10 تا کاربر همزمان خواستند اون کار رو بکنند متوجه میشی.)

حرفت رو در مورد فاصله زمانی تا بانک قبول ندارم چون من اون n تا دوستم رو پشت سر هم می فرستم و بلافاصله بعد از رسیدن یک نفر، نفر بعدی هم پشت سرش هست!!

در حالت عادی هم چند یوزر ممکنه با هم همون کار رو انجام بدهند!! چه ربطی داشت؟! 10 تا یوزری که با حلقه PHP و Query های تک تک کار رو انجام می دهند و 10 تا یوزری که یک بار Query می فرستند و در سمت برنامه MySQL (یا ...) خود برنامه دستور را در یک حلقه for انجام می دهد. این که همانی هست که قبلا تفاوت سرعت فاحش اش رو رد کردم!! :لبخندساده:

این دلایل رو ول کن، مدرک و سند داری بیار وگرنه این حرف های توجیهی برای من قابل قبول نیست!! :چشمک:

bestirani2
سه شنبه 19 مرداد 1389, 20:43 عصر
حرفت رو در مورد فاصله زمانی تا بانک قبول ندارم چون من اون n تا دوستم رو پشت سر هم می فرستم و بلافاصله بعد از رسیدن یک نفر، نفر بعدی هم پشت سرش هست!!

در حالت عادی هم چند یوزر ممکنه با هم همون کار رو انجام بدهند!! چه ربطی داشت؟! 10 تا یوزری که با حلقه PHP و Query های تک تک کار رو انجام می دهند و 10 تا یوزری که یک بار Query می فرستند و در سمت برنامه MySQL (یا ...) خود برنامه دستور را در یک حلقه for انجام می دهد. این که همانی هست که قبلا تفاوت سرعت فاحش اش رو رد کردم!! :لبخندساده:

این دلایل رو ول کن، مدرک و سند داری بیار وگرنه این حرف های توجیهی برای من قابل قبول نیست!! :چشمک:
همون هزار تا کاربر که گفتید رو از نظر مصرف با یک کوئری پیچیده مقایسه کنید
و رم مصرفی رو ببینید
به هر حال هرکی توی برنامه نویسی یک سری نظر هایی داره و همه چیز با سند نیست
مثل روش ها برنامه نویسی خاص که هر کی داره واسه خودش
مثلاً من چند تا الگوی طراحی برای خودم دارم که اگه کس دیگری هم این رو توی ذهنش داشته باشه ثبت نکرده و یا فریم ورک مخصوص خودم رو دارم
به هر حال خیلی چیزهای طی برنامه نویسی میاد
با این حال میتونید تست کنید
این تاپیک هم تا حدودی به این بحث مربوط هست
http://barnamenevis.org/forum/showthread.php?t=236033
در کل فشار بالایی میاد و زمان زیاد
اصلاً این همه کوئری هر موقع ممکنه به بنبست بر بخوره
و دقیقاً مثل همون دونه دونه فرستادن هست
خلاصه این نظر من بود
تو این کتاب هم اشاره ای شده
Advanced.PHP.Programming
البته خوب اونم یک برنامه نویس هست که نوشته و دلیل به درست بودن نیست ولی تجربه من این رو میگه
حال ممکنه تجربه من غلط باشه و یا شما
یک تست هم بگیرید و زمان و منابع مصرفی رو بررسی کنید

mamimami
چهارشنبه 20 مرداد 1389, 03:27 صبح
همون اول هم گفتم که این کار به چند دلیل منطقی نیست! :متفکر: اول به خاطر بار پردازشی زیاد مخصوصا موقعی که تعداد رکورد ها زیاد باشه و دوم به این خاطر که اگر id یک Primary Key باشه، ارتباط بین جداول از دست میره!! :لبخندساده:

حالا من نمیدونم چرا شما می خواهید از این روش مرتب سازی استفاده کنید و حتما توالی رو حفظ کنید، ولی این کار معمول نیست. حداقل برای من که تا حالا پیش نیامده که به چنین چیزی نیاز پیدا کنم. مثلا اگر بخواهید در خروجی یک شماره رکورد چاپ کنید (شماره تعداد، نه id)، خوب این کار رو میشه به روش های دیگر انجام داد، چرا داده های دیتابیس رو دستکاری می کنید! و ... و ... و ...
به هر حال تصمیم با شماست... :بوس:

خوب شد این سوال رو پرسیدم. :لبخند:

من منطقی یا غیر منطقی شو کاری ندارم. زیادم با برنامه نویسی آشنایی ندارم. فقط یه چیزایی تجربی یاد گرفتم. :لبخند:
بار پردازشی هم برام مهم نیست چون فقط یکبار میخوام اینکار رو انجام بدم و اونم توی لوکال هاست هست. و شدیدا به این کار هم نیاز دارم. چون سایت ما یه سایت کتابخانه مجازی هست و حدود 7500 تا کتاب داشت که بنا به دلابیلی مجبور شدیم 2000 تای اون رو حذف کنیم. به همین دلیل باید ID ها رو مرتب سازی کنیم.
راستی ارتباط بین جداول از دست میره رو اگه میشه بیشتر توضیح بدین واسم.
دقیقا چه مشکلی پیش میاد؟
مرسی.

bestirani2
چهارشنبه 20 مرداد 1389, 04:45 صبح
خوب شد این سوال رو پرسیدم. :لبخند:

من منطقی یا غیر منطقی شو کاری ندارم. زیادم با برنامه نویسی آشنایی ندارم. فقط یه چیزایی تجربی یاد گرفتم. :لبخند:
بار پردازشی هم برام مهم نیست چون فقط یکبار میخوام اینکار رو انجام بدم و اونم توی لوکال هاست هست. و شدیدا به این کار هم نیاز دارم. چون سایت ما یه سایت کتابخانه مجازی هست و حدود 7500 تا کتاب داشت که بنا به دلابیلی مجبور شدیم 2000 تای اون رو حذف کنیم. به همین دلیل باید ID ها رو مرتب سازی کنیم.
راستی ارتباط بین جداول از دست میره رو اگه میشه بیشتر توضیح بدین واسم.
دقیقا چه مشکلی پیش میاد؟
مرسی.
منظور در زمانی هست از کلید خارجی استفاده کردید

mamimami
چهارشنبه 20 مرداد 1389, 15:16 عصر
منظورم اینه که ارتباط جداول چطور قطع میشه و چه مشکلی به وجود میاد؟

bestirani2
چهارشنبه 20 مرداد 1389, 15:37 عصر
منظورم اینه که ارتباط جداول چطور قطع میشه و چه مشکلی به وجود میاد؟

وقتی ما دو تا جدول داریم که جدول دوم با توجه به یک آی دی در جدول اول یک سری اطلاعات دارد و آی دی ما عوض بشود، ارتباطات بهم میریزه
مثلاً در جدول اول
idو name داریم
و جدول دوم nameid و grade
حالا اگه ما id رو در جدول اول عوض کنیم ارتباطش با جدول دوم که همون nameid هست قطع میشود.