[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как найти пропущенный ID
dreamhunter
Здравствуйте, уважаемые форумчане.
Быть может этот вопрос уже обсуждался. Не подскажете ли, как решить такую задачу.
Есть таблица пользователей. У каждого свой уникальный ID. 1,2,3... n
Допустим один из пользователей с ID=2 удаляет свою учетную запись. Следовательно ID=2 уничтожается. Я хочу, чтобы следующий регистрирующийся пользователь записался в базу под этим свободным ID=2. Не подскажете ли какой запрос поможет определить пропущенный ID?



Спустя 49 минут, 30 секунд (26.08.2010 - 23:48) linker написал(а):
А можно вопрос, зачем такие извраты? Просто хочется понять мотивы, вдруг ты поймешь, что ошибался и что такие мудрости абсолютно не нужны.

Спустя 18 минут, 26 секунд (27.08.2010 - 00:06) dreamhunter написал(а):
Первый пользователь регистрируется и получает ID=1
При регистрации второго пользователя, я делаю запрос к базе:
$sql = "SELECT COUNT(`users`.`UID`)+1 AS UID FROM `users`"; - узнаю количество ID - 1, прибавляю 1 - это и будет ID нового пользователя - 2.

Этот способ хорош, если номера ID идут подряд, без пропусков. Но если я сделаю возможность пользователям удалять свою учетную запись, то тогда возникнут пропуски в ID
Допустим 5 пользователей, а третий удалился. тогда ID будут 1,2,4,5.
Мой запрс выдаст цифру 4+1=5, но ID=5 уже существует, так что этот способ не проходит. Кроме того, я не знаю сколько пользователей удалит свои учетные записи. Я хочу сделать запрос, который выявлял бы первый свободный номер ID и тогда я смогу присваивать его новому пользователю и заполнять пропуски.

Спустя 4 минуты, 59 секунд (27.08.2010 - 00:11) waldicom написал(а):
Такого делать не надо. Внимание: не надо. Поле id делается auto_incrementи все.
Если уж очень захочется сделать так, как написали Вы - то тогда жтого делать не надо.

Спустя 1 минута, 11 секунд (27.08.2010 - 00:12) linker написал(а):
Просто сделай в таблице поле UID автоинкрементным и MySQL все будет делать за тебя и причем гораздо быстрее. А о пропусках не беспокойся, ты о них даже не будешь заботиться и вскоре вообще забудешь про них.

Спустя 10 минут, 22 секунды (27.08.2010 - 00:23) dreamhunter написал(а):
Спасибо за ответы!
Сделал поле UID автоинкрементным.
Но мне хотелось бы заполнять пропуски для пущего порядка и красоты.
Почему о них не беспокоиться?)

Спустя 46 минут, 55 секунд (27.08.2010 - 01:10) Nikitian написал(а):
Порядок и красоту обеспечит мускуль сам. Просто они будут несколько своеобразными. Не стоит его приучать к вашим понятиям о порядке и красоте: ваши идеи взрощены на минимальном опыте, а логику мускуля строят не глупые люди годами. Не верю, что у вас имеются объективные, неопровержимые задачи такого извращённого способа приращения.

Спустя 15 минут, 4 секунды (27.08.2010 - 01:25) FatCat написал(а):
Цитата (dreamhunter @ 27.08.2010 - 01:23)
мне хотелось бы заполнять пропуски

А теперь представь, что два новых пользователя регистрируются с интервалом времени меньше, чем время обращения к базе. При запросе поиска "дыры" оба получили одну цифру, и оба пытаются записать в эту строку свой профиль.
База конечно не порушится, но один из двух получит критическую ошибку сценария вместо регистрации.
Я понимаю, что вероятность такого совпадения довольно мала, но не вижу смысла писать неустойчивый код, если можно сразу писать устойчивый.

Спустя 1 час, 13 минут, 29 секунд (27.08.2010 - 02:38) dreamhunter написал(а):
Ок, я понял, что дыры в нумерации - это нормально.
Большое спасибо за ответы!

Спустя 3 дня, 32 минуты, 26 секунд (30.08.2010 - 03:11) Ymnik написал(а):
FatCat-А с этогоместа можно по подробнее? Тк если ты прав мне нужно переделать 2 своих сайта а они очень болшие.... Разве запросы к mysql не становятся в очередь и выполняются по очереди?

Спустя 9 минут, 14 секунд (30.08.2010 - 03:20) Ymnik написал(а):
И есе несложно извести меня в письма:)

Спустя 3 часа (30.08.2010 - 06:20) twin написал(а):
Цитата
Разве запросы к mysql не становятся в очередь и выполняются по очереди?
Становятся. Но только те, которые уже поступили. Ну или транзакции.

А запрос на проверку и запись - разные запросы. И между ними есть промежуток. Вот в него и может вклиниться другой процесс. Вероятность ничтожно мала, но существует. По этому FatCat трижды прав - писать надо чисто.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.