Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Cдвинуть ID? 
:(
    Опции темы
Guest
Дата 2.3.2005, 11:07 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











В таблице есть AUTO_INCREMENT поле ID. Как сделать, чтобы при удалении записи, ID сдвигались, если удалили 2-ю запись, ID равное 3 стало равным 2-м?
  Вверх
Akina
Дата 2.3.2005, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Не делать. Даже выкинуть саму мысль о таком безобразии. Нужна тебе непрерывная нумерация - получай ее в момент выполнения запроса. А ID записи руками не трожь - он не для тебя, а для связывания таблиц.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Kesh
Дата 2.3.2005, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2488
Регистрация: 31.7.2002
Где: Германия, Saarbrü cken

Репутация: 15
Всего: 54



Guest а действительно, зачем такое может быть нужно?..



--------------------
user posted image
PM MAIL WWW ICQ Skype   Вверх
Zandr
Дата 4.3.2005, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 433
Регистрация: 16.7.2004
Где: Новосибирск

Репутация: нет
Всего: 13



Я не гуест. smile (в смысле не я постил вопрос)

Могу предположить, что нужно обновлять бОльшую часть записей таблицы достаточно часто.
Кстати, интересно, почему в столбцах auto_increment не предусмотрено повторное использование удаленных ключей, когда значение доходит до максимума... Нада литературку почитать по этому поводу...

Это сообщение отредактировал(а) Zandr - 4.3.2005, 12:12
PM MAIL   Вверх
Kesh
Дата 4.3.2005, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2488
Регистрация: 31.7.2002
Где: Германия, Saarbrü cken

Репутация: 15
Всего: 54



Цитата(Zandr @ 4.3.2005, 12:12)
Кстати, интересно, почему в столбцах auto_increment не предусмотрено повторное использование удаленных ключей, когда значение доходит до максимума...

Как это не предусмотрено?..


--------------------
user posted image
PM MAIL WWW ICQ Skype   Вверх
Zandr
Дата 4.3.2005, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 433
Регистрация: 16.7.2004
Где: Новосибирск

Репутация: нет
Всего: 13



Код

mysql> create table aaa (id tinyint auto_increment primary key);
Query OK, 0 rows affected (0.61 sec)

mysql> insert into aaa values (126);
Query OK, 1 row affected (0.02 sec)

mysql> insert into aaa values ();
Query OK, 1 row affected (0.00 sec)

mysql> insert into aaa values ();
ERROR 1062 (23000): Duplicate entry '127' for key 1


Что и где нада сказать чтобы это использование включить?

Это сообщение отредактировал(а) Zandr - 4.3.2005, 12:51
PM MAIL   Вверх
Akina
Дата 4.3.2005, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(Zandr @ 4.3.2005, 13:50)
Что и где нада сказать чтобы это использование включить?

ЭТО в принципе не имеет смысла - а следовательно просто не надо так делать... а при наличии других полей не указываем заполнение поля ID - на то и автоматика


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Zandr
Дата 4.3.2005, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 433
Регистрация: 16.7.2004
Где: Новосибирск

Репутация: нет
Всего: 13



Это какая-то недоавтоматика.... Есть у меня табличка с какими-нибуть объектами
Код

create table items (
   id integer unsigned auto_increment primary key,
   name varchar (255),
   --- other attrs ---,
   unique(name)
);

Данные по этим объектам постоянно обновляются и добавляются новые (причем большими партиями из внешнего источника):
Код

replace into items set name='...', .......;

Вот тут и начинается... при замене строки предыдущая не изменяется, а удаляется и в таблицу вносится новая с соответствующими данными и следующим свободным интом. Про целостность внешних ключей на этот id не знаю (буду проверять сработает ли on update cascade), а вот счетчик-то тикает к максимуму. Очень интересно будет когда через пару лет (может больше, может меньше, может вообще не дождетесь - зависит от интенсивности работы) этот запрос начнет вываливать ошибку 1062. Хотя в таблице стабильно держится записей 500000 плюс/минус 100000 и свободных id - завались.

Так что вместо одного запроса будем узнавать есть ли уже объект с таким именем, и далее либо update либо insert. Вот это мне и не нравится пока.

Это сообщение отредактировал(а) Zandr - 4.3.2005, 14:29
PM MAIL   Вверх
Akina
Дата 4.3.2005, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Zandr
Ты... эта... какой нах... replace??? изменять записи положено инструкцией update... replace - это комбинация delete и insert, так что все пральна... хелпу читаем...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
GoodBoy
Дата 4.3.2005, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Главный джедай
****


Профиль
Группа: Модератор
Сообщений: 3886
Регистрация: 8.1.2003
Где: КМВ

Репутация: 2
Всего: 83



Цитата(Akina @ 4.3.2005, 15:22)
replace - это комбинация delete и insert

Стоп, не все так просто! http://dev.mysql.com/doc/mysql/ru/replace.html

Если у тебя есть поле, которое Primary key и auto_increment, а ты в операторе replace его указываешь, то запись удалится и вставится с ЭТИМ ЖЕ значением данного поля!!! Т. е. никакого увеличения автоинкрементного поля НЕ произойдёт!


--------------------
Чем дальше в лес, тем толще партизаны...

Цитата(igorold @  1.5.2016,  17:40 Найти цитируемый пост)
Индейцы не обратили внимания на поток беженцев из Европы… Теперь они живут в резервациях. 
PM MAIL   Вверх
Akina
Дата 4.3.2005, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(GoodBoy @ 4.3.2005, 17:27)
Если у тебя есть поле, которое Primary key и auto_increment, а ты в операторе replace его указываешь, то запись удалится и вставится с ЭТИМ ЖЕ значением данного поля!!!

Совершенно очевидно, что если ты явно указываешь значение, оно и вставляется. Движок БД - дурак без инициативы, он делает именно то что ты просишь, а если не может - сообщает об ошибке. Никакой самодеятельности он не проявляет. Так что то что говорю я, никоим образом не противоречит тому на что указываешь ты.
С другой стороны явное задание значения автоинкрементному первичному ключу мне лично кажется просто глупым и не имеющим никакого смысла - даже базу так развалить, и то не удастся...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
GoodBoy
Дата 4.3.2005, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Главный джедай
****


Профиль
Группа: Модератор
Сообщений: 3886
Регистрация: 8.1.2003
Где: КМВ

Репутация: 2
Всего: 83



Цитата(Akina @ 4.3.2005, 16:38)
С другой стороны явное задание значения автоинкрементному первичному ключу мне лично кажется просто глупым и не имеющим никакого смысла

При UPDATE записи!

смотри, обычно делается так:

Код
if (существует ID_записи) {
   UPDATE table SET field1=val1, field2=val2, ... fieldN=valN WHERE id=ID_записи;
} else {
   INSERT INTO table (field1, field2, ... fieldN) VALUES (val1, val2, ... valN)
}

Правильно?
а при использовании REPLACE всё сводится в одной записи:
Код
REPLACE INTO table (field1, field2, ... fieldN, id) VALUES (val1, val2, ... valN, ID_записи);

И если переменная ID_записи имеет значение, то запись с таким id - "обновится", а если переменная ID_записи не установлена, то в таблицу добавится новая запись!


--------------------
Чем дальше в лес, тем толще партизаны...

Цитата(igorold @  1.5.2016,  17:40 Найти цитируемый пост)
Индейцы не обратили внимания на поток беженцев из Европы… Теперь они живут в резервациях. 
PM MAIL   Вверх
Druidik25
Дата 9.4.2005, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 27.1.2005
Где: Киев, Украина

Репутация: нет
Всего: нет



Можно ли подробнее, как можно узнать, что запись с таким параметром существует, и если нету то добавить????
PM MAIL ICQ   Вверх
Secandr
Дата 11.4.2005, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: 6
Всего: 39



Druidik25 сделать селект.


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0580 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.