PDA

View Full Version : چجوری میتونم قبل از اینسرت مقدار فیلد auto-increment رو تشخیص بدم؟؟



tabib_m
چهارشنبه 12 مرداد 1384, 17:25 عصر
چجوری میتونم قبل از اینسرت مقدار فیلد auto-increment رو تشخیص بدم؟؟
یعنی فرض کنید یک جدول دارم که فیلدهاش name , family , id باشه و id، auto-increment باشه.
حالا میخوام یه رکورد جدید اینسرت کنم، میخوام مقداری رو که آیدی دریافت میکنه ، قبل از اینسرت بدست بیارم.

oxygenws
چهارشنبه 12 مرداد 1384, 21:53 عصر
قبلش نمی تونی(شاید بتونی، من دقیق نمی دونم) ولی بعدش می تونی!!

tabib_m
پنج شنبه 13 مرداد 1384, 10:32 صبح
بالاخره وقتی mysql به طور اتوماتیک عدد بعدی رو انتخاب میکنه ، حتما عدد قبلی رو یه جایی ذخیره کرده.
نمیشه بهش دسترسی پیدا کرد؟؟

oxygenws
پنج شنبه 13 مرداد 1384, 12:09 عصر
این اطلاعات در خود موتور بانک (جایی که کل اطلاعات جداول و ... ذخیره میشه) قرار داره.
من راهی برای دسترسی به اون نمی دونم، اما ممکنه وجود داشته باشه، راهنمای MySQL رو بخون!
اگر به نتیجه ای رسیدی، ممنون میشم اینجا بگی.

ضمن اینکه اگر کل کاری که دوست داری بکنی رو اگر بگی، میشه کمکت کرد..... به نظر میرسه کلا روشت مشک داره!

tabib_m
پنج شنبه 13 مرداد 1384, 22:41 عصر
من کار خاصی ندارم
یعنی تا حالا برای کارام این کار رو میکردم:
اول یه رکورد خالی اینسرت میکردم و بعد میتونستم آیدی ش رو بفهمم. بعد اون رو آپدیت میکردم

میخواستم بدونم میتونم بدون این کارا به نتیجه برسم یا نه. چون با این روش هر دفعه صفحه باز میشه یه رکورد خالی اینسرت میشه و باید دستور پاک کردن رکوردهای خالی رو هم بدم

به هر حال راه حل بدی نیست.
میشه ازش استفاده کرد.

Happy_davood
جمعه 14 مرداد 1384, 01:05 صبح
خوب دوست عزیز قبل از اینکه رکورد جدید رو وارد کنید یک Select بزنید :


DECLARE @MaxID smallint
SELECT @MaxID = MAX(ID) FROM Members
SET @CurrentID = @MaxID + 1


خوب اگر مثلاً آخرین ID برابر 1150 بوده الان هم خواهد شد 1151 .

tabib_m
جمعه 14 مرداد 1384, 02:08 صبح
این راه صحیح نیست!!

چون ممکنه من یه رکورد رو حذف کرده باشم.
مثلا اگر آخرین آی دی من 140 بوده باشه و من اونو حذف کنم ، در نتیجه آخرین آیدی من به 139 مبدل شده. و وقتی که بخوام یه رکورد جدید اینسرت کنم، رکرود جدید با آیدی 141 ثبت میشه، نه با 140.
اونوقت اینجاس که راه حل شما ایراد پیدا میکنه.

Happy_davood
جمعه 14 مرداد 1384, 10:02 صبح
راست می گید . فکر اینجاش رو نکرده بود .

oxygenws
شنبه 15 مرداد 1384, 02:51 صبح
اول یه رکورد خالی اینسرت میکردم و بعد میتونستم آیدی ش رو بفهمم. بعد اون رو آپدیت میکردم
مشکل من اینه که هیچ توجیهی برای این کارت نمی بینم!!!

Mohammad Minaei
شنبه 15 مرداد 1384, 06:16 صبح
اطلاعات mysql_insert_id رو از تو php Manual پیدا کن و روش کار کن. احتمالا خودشه. (تست نکردم!!)

tabib_m
شنبه 15 مرداد 1384, 09:43 صبح
احتمالا خودشه
من phpmanual رو دیدم. ولی الان در موقعیتی نیستم که تابع رو تست کنم.
اگه دیدم کارش درسته خبرتون میکنم.

خیلی ممنون

oxygenws
شنبه 15 مرداد 1384, 10:48 صبح
نه.....
این تابع id بعد از insert رو نشون میده.... id آخرین فیلدی که توسط اون connection وارد بانک شده.

Mohammad Minaei
شنبه 15 مرداد 1384, 10:50 صبح
دستت درد نکنه!!

spidermanX
پنج شنبه 10 شهریور 1384, 15:40 عصر
فکر کنم یا اطلاعات من ناقصه و یا شما حواستون پرته(ببخشیدا بی احترامی نشه)
در صورتی که یک رکورد با فیلد آیدی 400 داشته باشید و اون رو حذف کنید بعد از اضافه نمودن رکورد جدید آیدی اون 401 می شه نه 400 .
این هم به علت ویژگی autoIncrement هست.

oxygenws
پنج شنبه 10 شهریور 1384, 19:12 عصر
درسته جناب عنکبوتی :)
هم صحبت های شما درسته و هم صحبت های ما..... فقط مشکل اینجاست که شما کامل و درست تمام پست های قبلی رو نخوندی :)

tabib_m
سه شنبه 20 دی 1384, 15:34 عصر
یه مسئله ی اساسی که هیچ کدوممون بهش فکر نکرده بودیم اینه که اصلا نباید این امکان باشه.

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

به طور کلی این رو میخوام بگم که mysql فقط در لحظه ی اینسرت تعیین میکنه که آی دی باید چی باشه. یعنی دقیقا قبل از اینسرت تشخیص داده میشه. یعنی وقتی MySQL به دستور insert میرسه تازه فعالیتشو انجام میده که ببینه چه آی دی ای باید ثبت بشه.

امیدوارم مفهوم بوده باشه.

Neyshaburi
دوشنبه 13 مهر 1394, 14:18 عصر
منم دنبالشم
من میخوام همزمان دوتا رکورد در دو تیبل اینسرت کنم بطوری که از طریق id هاشون با هم لینک بشن

یک راهش اینه که در مواقع اینسرت کردن یک نشانه با مقدار اولیه "1" رو یک واحد افزایش بدیم

ولی من بدنبال راه علمیش هستم

مطمئنا راهی داره که از طریق sql بشه آخرین id استفاده شده رو کشف کرد

ممنون میشم دوستان راهنمایی کنن

H:Shojaei
دوشنبه 13 مهر 1394, 15:02 عصر
منم دنبالشم
من میخوام همزمان دوتا رکورد در دو تیبل اینسرت کنم بطوری که از طریق id هاشون با هم لینک بشن

یک راهش اینه که در مواقع اینسرت کردن یک نشانه با مقدار اولیه "1" رو یک واحد افزایش بدیم

ولی من بدنبال راه علمیش هستم

مطمئنا راهی داره که از طریق sql بشه آخرین id استفاده شده رو کشف کرد

ممنون میشم دوستان راهنمایی کنن
درباره last insert id in mysql جستجو کنید...

hamedarian2009
دوشنبه 13 مهر 1394, 15:39 عصر
تاپیک مال 10 سال پیشه الان علم پیشرفت کرده مثلا برای PHP تو لینک زیر مثال زده :
http://www.w3schools.com/php/php_mysql_insert_lastid.asp

kabootar_y
دوشنبه 13 مهر 1394, 17:49 عصر
یه مسئله ی اساسی که هیچ کدوممون بهش فکر نکرده بودیم اینه که اصلا نباید این امکان باشه.

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

به طور کلی این رو میخوام بگم که mysql فقط در لحظه ی اینسرت تعیین میکنه که آی دی باید چی باشه. یعنی دقیقا قبل از اینسرت تشخیص داده میشه. یعنی وقتی MySQL به دستور insert میرسه تازه فعالیتشو انجام میده که ببینه چه آی دی ای باید ثبت بشه.

امیدوارم مفهوم بوده باشه.


دوست عزیز انگار شما چیستان مطرح کردی و وقتی دیدی کسی جوابش رو نمی دونه خودت جواب داری
سوء تفاهم نشه مزاح کردم

اگر می خواهید مشکلتون حل بشه من یه راه بتون میگم ولی اگه می خواهید فقط ببینید همچین امکانی وجود داره یا نه من نمی دونم باید چی کار کرد

برای حل این مشکل من این طور پیشنهاد می کنم:

از اونجایی که مقدار یک فیلد auto-increment می تونه به صورت دستی هم ثبت بشه میشه اول با یک select مقدار بزرگترین id رو گرفت و یکی بهش اضافه که کرد و در در کوئری insert جدید برای id قرار داد

مثال:








$get_id = mysql_fetch_array(mysql_query("SELECT id FROM mytable ORDER BY ID DESC LIMIT 1"));


$new_id = $get_id['id']+1;


mysql_query("INSERT INTO mytable (id, name, family) VALUES ($new_id, $name, $family)");