منزل
Top.Mail.Ru Yandeks.Metrika
المنتدى: "القواعد";
الأرشيف الحالي: 2002.01.08;
تنزيل: [xml.tar.bz2];

إلى

تحديد أول معرف مجاني البحث عن فروع مماثلة


S_King   (2001-12-04 10:18) [0]

Мастера помогите как определить в хранимой процедуре 1-й свободный №? Имеем таблицу с заполненым полем (1,2,4,5...),т.е. процедура должна выдать 3.



Vadim   (2001-12-04 10:51) [1]

Только "криво" - перебором строк, или при помощи вспомогательной таблицы. Может, можно задачу по-другому поставить?



Владислав   (2001-12-04 10:57) [2]

Сделай выборку, отсортированную по возрастанию. Пробегись по всем записям (ну не по всем, а до тех пор, пока не найдешь нужный номер) найди то, что нужно и используй.

Только если ты хочешь получить уникальный номер, это не самый лучший вариант (а может быть и самый худший). Представь, что получиться, если два пользователя будут одновременно получать такой номер.



Yuvich   (2001-12-04 16:11) [3]

Если задача стоит именно так, то чтобы исключить ситуацию, описанную Владиславом ("Представь, что получиться, если два пользователя будут одновременно получать такой номер."), надо применить то что предлагает Vadim ("при помощи вспомогательной таблицы").

Вспомогательная таблица ведет список "дыр" в номерах. Как дыра образовалась - ее вставили в эту таблицу; как нужно заполнить дыру - прочитали из этой таблицы минимальный номер и удалили этот номер из этой таблицы. Все делается в триггерах и при блокировках "таблицы дыр", поэтому два пользователя никогда не прочитают один номер. Если используется метод исчисления, то нужно блокировать всю "целевую таблицу" - а это плохо для других пользователей, которые могут просто читать данные.



S_King   (2001-12-04 16:43) [4]

Все это понятно, но может быть можно прокрутить цикл
от 1 до max(Id) в хран. процедуре?

P/S: Извените, может быть плохо формулирую вопрос.



Vadim   (2001-12-04 16:52) [5]

إنه ممكن ، لكن هناك "لكن": ليس مضمونًا أن اثنين من المستخدمين في نفس الوقت لن يبدؤوا "بتدوير الدورة" ولن يتعثروا في نفس "الثقب" (أنا شخصياً أقيم هذا الاحتمال مرتفعًا جدًا). إذا كان ذلك ، بشرط المشكلة ، جائزًا ، ثم اذهب ، إن لم يكن ، انظر أعلاه.



dmitryK   (2001-12-04 17:12) [6]

Если пользуешься SQL сервером, то логично решать такие задачи SQL-запросом, т.е. примерно так

select min(t1.ID)+1
from tabX t1 left join tabX t2 on t1.ID=t2.ID+1
where where t2.ID is NULL

будет работать все-таки быстрее чем программный перебор. А еще можно это реализовать с помощью журнала удаленных записей. Вешаешь триггер на удаление записи (бефоре) и сохраняешь все ID удаленных записей в отдельную таблицу. В таком случае при добавлении новых записей фактически нет потери времени на поиск (критично при одновременном добавлении большого количества записей). А что бы два пользователя не захватывали один ID поиск и добавление записи произодишь в одной транзакции.



S_King   (2001-12-05 09:55) [7]

Извените ребят, но я же не спрашивал про нескольких пользователей...
Но как все таки сделать цикл для одной таблицы



dmitryK   (2001-12-05 10:49) [8]

Что-то теперь я не понимаю, ты спрашивал как найти минимальный свободный ID. Я тебе привел запрос как это сделать. Зачем, спрашивается, тебе еще и цикл организовывать????



S_King   (2001-12-05 11:21) [9]

Я, что то не понял текста запроса, можно ли его создать для одной и той же таблицы?



dmitryK   (2001-12-05 12:33) [10]

select min(t1.ID)+1
from tabX t1 left join tabX t2 on t1.ID=t2.ID+1
where where t2.ID is NULL

tabX - это и есть твоя таблица. Она объединяется сама с собой. В результате получаешь запрос, который включает две колонки с ID
первая - все ID имеющиеся в твоей таблице,
вторая - если ID+1 есть, то ее значение, если нет, то NULL

where where t2.ID is NULL - оставляет только те где вторая колонка NULL, т.е. ID+1 свободно.

min(t1.ID)+1 - возращает минимальный номер свободного ID.

Подробнее читай описание языка SQL.

У такого запроса только один недостаток, должна быть хотябы одна запись в таблице, и номер свободного ID будет всегда больше минимального занятого.
Но это уже другая история...



S_King   (2001-12-05 16:32) [11]

Не знаю почему, но у меня этот запрос вешает базу насмерть.
пробовал в consol, expert



صفحات: 1 فرع كامل

المنتدى: "القواعد";
الأرشيف الحالي: 2002.01.08;
تنزيل: [xml.tar.bz2];

الطابق العلوي









الذاكرة: 0.59 ميغابايت
الوقت: 0.027 ج
1-22257
Dmitry1
2001-12-14 16:53
2002.01.08
يوم جيد


3-21906
يوري جوكوف
2001-11-21 09:40
2002.01.08
Oracle ADO vs DOA - fido7.ru.delphi.db


1-22018
DelphiG
2001-12-18 01:51
2002.01.08
طباعة النص من مذكرة! لدي شيء خاطئ ....


1-21999
فيل
2001-12-15 02:02
2002.01.08
C ++ أو دلفي


14-22412
fishka
2001-11-12 14:50
2002.01.08
المكونات وموقعها لراحة المشغل (Delphi 3)





الأفريكانية الألبانية عربي الأرميني أذربيجان الباسكي البيلاروسية Bulgarian التشيكية الصينية المبسطة) تقاليد صينية) الكرواتية التشيكية دانماركي Dutch أنجليزي الإستونية الفلبينية Finnish جيب
الجاليكية الجورجية الألمانيّة اليونانيّة الكريولية الهايتية اللغة العبرية الهندية الهنغارية أيسلندي Indonesian الأيرلندية Italian اليابانيّة الكوريّة اللاتفية اللتوانية المقدونية الملايو المالطية Norwegian
اللغة الفارسية بولنديّة البرتغاليّة رومانية Russian صربي السلوفاكيّة سلوفيني إسباني السواحيلي Swedish Thai التركية الأوكراني الأردية الفيتنامية ويلزي اليديشية البنغالي البوسنية
السيبيونو الاسبرانتو الغوجاراتية الهوسا همونغ الإيبو جاوي الكانادا الخمير لاو لاتينية الماوري المهاراتية المنغولية النيبالية البنجابية الصومالية التاميل التيلجو اليوروبا
زولو
Английский Французский ألماني Итальянский البرتغالية Русский Испанский