• Авторизация


вопрос(mysql) 22-04-2005 09:18 к комментариям - к полной версии - понравилось!


есть допустим у меня в бд записи вида id|name|text|
пусть это будут записи о юзерах. id каждый раз формируеца с помощью select MAX(id) + 1
так вот удалил я одного юзера, скажем id=10
остались юзеры с id>10, id<10 но вот id=10 боля нету. Вопрос: как реализовать шоб при следующей регистрации юзер получил id=10? т.е. число отсутствуещее в цепи чисел %)

В колонках играет - soad
QaSt

апдейт: кодим на php
вверх^ к полной версии понравилось! в evernote
Комментарии (10):
Teonanacatl 22-04-2005-09:20 удалить
А для чего это собственно нужно?
Я имею в виду непрерывную последовательность ID?
Teonanacatl 22-04-2005-09:31 удалить
Пока на ум приходит одно простое рещение...
Заводица дополнительная таблица, где храняца удаленные ID...
При следующей вставке юзера просто береца MIN(ID) из этой таблицы, с последующим удалением этого ID из временной таблицы...
Wethril_Haldar 22-04-2005-09:35 удалить
) задачка забавная
на практике как правило авто_инкремент)))
Wincy 22-04-2005-09:50 удалить
Автор!!! Категорически не советую так делать! ЗАБУДЬ ПРО ЭТО.
Писал я движок для одного проекта, довольно крупного, решил сделать такую же феньку, т.к. раздрожало меня то, что ИД не по порядку идёт... БЛИН! Потом при удалении/добавлении/редактировании новости/поста просто всё путалось, кривилось и не хотело работать.
Главное, не только у меня такое было. На самом деле читал даже мануал, где так категорические не советуют делать.
А зачем тебе это?
holy_diver 22-04-2005-10:39 удалить
Блин, а оно надо? С временной таблиецей делается легко, но вот потом целостность данных обеспечивать... Храни тебя господь наш Рандом от такого.
QaSt, можно учудить искомое следующим образом - выполняешь такой запрос:
code:

select
t1.id, -- нафиг не нужно, но без этого ругается на having
(max(t2.id) + 1) as new_id
from $fromtable as t1
inner join $fromtable as t2 on t1.id>t2.id
group by t1.id
having (t1.id - max(t2.id)) > 1
order by new_id
limit 1


Если возвращает пустое значение new_id, то в запросе на создание новой записи просто не указывай пару ID=<новое значение> и AUTO_INCREMENT самолично закинет туда MAX(id) + 1
Но как по мне - проще юзать только AUTO_INCREMENT и не париться насчет дыр из-за удаленных ID-ов :)

Идея смодернезирована отсюда
P_a_s_h_a 22-04-2005-12:15 удалить
Ну, в стандартном SQL эта задача решается так:
(если в mysql не поддердживаются ANSI-фичи, sorry, бо собственно mySql не знаю)
code:

select min(id)+1 from fromtable o1 where not exists
(select 1 from fromtable o2 where o2.id = o1.id +1)


Interbase,Oracle,MsSql-будет работать.
Пустое значение возвратит только если в таблице нет записей вообще, тогда в первую запись можно будет втулить единицу или ноль, или с чего там ID хотите начинать.
P_a_s_h_a, так будет работать в мускуле начиная с версии 4.1 - только там появились подзапросы.
VictorT 22-04-2005-13:17 удалить
Имхо, такая "идея" (по поводу списка значений без дырок), возникает у каждого поначалу (и у меня возникала). Только смысла в ней нет.

А по поводу:
id каждый раз формируеца с помощью select MAX(id) + 1

Лучше просто сделать поле автоинкриментным, а не делать это ручками.
QaSt 22-04-2005-15:13 удалить
каждый вариант интересен па своему


Комментарии (10): вверх^

Вы сейчас не можете прокомментировать это сообщение.

Дневник вопрос(mysql) | community_coding - Сообщество программистов | Лента друзей community_coding / Полная версия Добавить в друзья Страницы: раньше»