Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > смещаемый id (БД MySQL)


Автор: IZ@TOP 18.3.2003, 00:26
----- BD MySQL -----

Вопрос:
как сделать так чтоб при удалении строки из таблицы, номер йд следующей за ней строкой принимал значение удаленной и те за ней так же меняли confused.gif?

например:
Код


table test
------------------------------------------------
| id  ||                    text                       |
------------------------------------------------
|  1  ||                   text1                      |
------------------------------------------------
|  2  ||                   text2                      |
------------------------------------------------
|  3  ||                   text3                      |
===========================
Допустим я удолю строку id= 1 тогда мне надо чтоб Id = 2 принял значение 1, а id = 3 значение 2:

------------------------------------------------
| id  ||                    text                       |
------------------------------------------------
|  1  ||                   text2                      |
------------------------------------------------
|  2  ||                   text3                      |
===========================


При обьяве (id int not null auto_increment,text text,primary key(id))
он еще и при удалении допустим значений 20 ,добавленную строку помечает id = 21
а мне нужно чтоб смещалось ! Плз ПОМОГИТЕ, ЧТО ДЕЛАТЬ confused.gif?

Автор: Medved 18.3.2003, 05:00
А зачем? На то аутокримент и существует, чтобы не повторялись ключевые значения.

Автор: IZ@TOP 18.3.2003, 17:34
Цитата
А зачем? На то аутокримент и существует, чтобы не повторялись ключевые значения.


А мне нужно чтобы при удалении он смещался !

Автор: SmaLL 18.3.2003, 17:37
Цитата(Iz @ 18.3.2003, 09:34)
Цитата
А зачем? На то аутокримент и существует, чтобы не повторялись ключевые значения.


А мне нужно чтобы при удалении он смещался !

Автоинкрементное поле не сдвинется! Хоть тресни!

Автор: AntonSaburov 18.3.2003, 19:05
Если надо иметь такой ID - то стОит задуматься о перепроектировании.

А если надо просто ну никак - бшлокируешь таблицу и сразу после удаления
(обозначим удаленный id как id_deleted)

update TABLE set id=id-1 where id>id_deleted

Хотя я настоятельно рекомендую посмотреть вариант, чтобы этого не делать.

Автор: IZ@TOP 18.3.2003, 19:40
Ладно, спасибо за информацию.

И у меня тут созрел еще один вопрос:
А как сделать чтоб ID генерился из четырех-пяти значных чисел ?

Автор: AntonSaburov 18.3.2003, 20:51
Цитата
А как сделать чтоб ID генерился из четырех-пяти значных чисел ?


А что, целое 32 бита таких величин не поддерживает ?

Автор: IZ@TOP 18.3.2003, 21:33
AntonSaburov может ты меня не так понял, мне надо что бы id не с 1 генерилось а уникальные вроде там 4679 следующее число 7583 ну и тд.

Автор: AntonSaburov 18.3.2003, 21:55
Цитата
AntonSaburov может ты меня не так понял,


Не без этого biggrin.gif

А как ты генеришь сейчас ?

Автор: Oleg 18.3.2003, 22:49
Я вроде понял, у меня тоже такое было, правда не на MySQL, но я бы сделал id не аутоинкремент, а просто длинным целым , и процедуру, котороая в цикле пробегала бы всю таблицу (или нижний кусок после удаленной записи )и меняла бы id

условно говоря:
...
for i:= 1 to table.recordcount do begin
table.recno:= i;
id:= i
end;
...
что-то вроде этого.

Автор: U-gene 20.3.2003, 05:58
Хоть тресни, не могу ВООБЩЕ понять, зачем такое поле надо. Ссылаться на него нельзя (в следущий раз можно попасть на другую запись), что бы число записей в таблице посмотеть - так это через COUNT можно сделать. Никакой полезной информации оно ИМХО нести не может, поскольку меняется. Например, пользователь сегодня видит одну 20-ю запись, а завтра 20-ой окажеться другая запись. Ежели не секрет, поделитесь, зачем оно?

Автор: IZ@TOP 20.3.2003, 17:36
Да была одна мысль ... но я думаю действительно геморойничать не к чему ...

Автор: AntonSaburov 20.3.2003, 18:05
Цитата
Да была одна мысль ... но я думаю действительно геморойничать не к чему ...


Вот это правильно biggrin.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)