Головна сторінка
Top.Mail.Ru Яндекс.Метрика
Форум: "Бази";
Поточний архів: 2002.01.08;
Завантажити: [xml.tar.bz2];

Вниз

Визначити перший вільний ID Знайти схожі гілки


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.85 MB
Час: 0.026 c
1-22127
Delphimun
2001-12-15 13:43
2002.01.08
Як курсор завантажений з ресурсу в змінну зберегти в файлі (cur)?


1-22015
мисливець
2001-12-17 13:17
2002.01.08
Картинку на принтер


1-22219
dimonf
2001-12-16 17:23
2002.01.08
Як зробити, щоб Canvas промальовувався при будь-яких моніпуляціх з вікном


3-21948
andre_polt
2001-12-04 16:22
2002.01.08
DB


3-21921
MVova
2001-12-04 10:41
2002.01.08
Зв'язок багато до багатьох;)





африкаанс албанський арабська вірменин азербайджанець баскський білоруський болгарська каталонський Китайська (спрощене письмо) Китайський традиційний) хорватський чеська данську мову нідерландський Ukranian естонець Філіппінська фінську мову французький
галісійська грузинський німецький грецький гаїтянський креольський давньоєврейську хінді угорський ісландський індонезієць ірландський італійський японський корейський латиська литовець македонець малайський мальтійський норвежець
перс полірування португальська румунський російська сербський словацький словенський іспанська суахілі шведську мову тайський турецька український урду в'єтнамський валлійський ідиш бенгальський боснійський
кебуано есперанто гуджараті хауса хмонг ігбо яванський каннада кхмерская Лао латинь маорі маратхі монгольський непальська панджабі сомалійський тамільська телугу йоруба
зулуський
Англійська Французький Німецький Італійський Португальська Русский Іспанська