Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Удаление записи с полем AUTO_INCREMENT  (Прочитано 9666 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
andrystepa
Помогающий

ru
Offline Offline

« : 09-10-2008 12:23 » 

База данных в MySQL. В таблице поле первичного ключа - id сделано как AUTO_INCREMENT. Проблема в том, что если удаляется последняя запись, то при следующем добавлении новая запись получает не тот id, который был у удаленной записи, а на единицу больше. Это не удобно, так как нарушается последовательность нумерации записей. Можно, конечно как-то извратиться при помощи функции FOUND_ROWS(), но при этом уже свойство AUTO_INCREMENT будет бессмысленно. Можно ли как-то заставить MySQL автоматически определять, какой последний номер в поле с атрибутом AUTO_INCREMENT и добавлять следующую запись исходя из этого?
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 09-10-2008 12:52 » 

а зачем?
а если удалить запись в середине? Ведь тоже нарушается последовательность.

Ведь база многопользовательская, реально с таблицей могут работать несколько пользовательских процессов и последняя запись ничем не отличается от той, которая в середине
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #2 : 09-10-2008 13:41 » 

andrystepa, а зучем нужна последовательность нумерации записей?
Записан

Удачного всем кодинга! -=x[PooH]x=-
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 09-10-2008 19:42 » 

andrystepa,

1. Строгая последовательность записей в большинстве случаев не нужна.
2. Если очень надо, то, при создании новой записи:
a) Блокируй таблицу - LOCK TABLE tab WRITE
b) Запрашивай макс + 1 - SELECT MAX(id) + 1 FROM tab - это и будет твой след. номер
c) Тут же записывай - INSERT ...
d) Снимай блокировку - UNLOCK TABLES
Если не заблокировать таблицу, то могут быть конкурентные вставки или аналогичные запросы, которые подпортят малину.

Лучше подумай о п.1.
П.2 должен быть обоснован.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
andrystepa
Помогающий

ru
Offline Offline

« Ответ #4 : 10-10-2008 09:29 » 

На самом деле, действительно не обязательно делать строгую последовательность записи. Я предполагал использовать id для нумерации в табице, которая будет выводиться браузером пользователя после обработки запроса - да только это ни к чему. Нумерацию можно создать в цикле, выводящем данные - об этом я не подумал, извиняюсь. Тем не менее, спасибо за подсказку - возможно еще пригодится.
Записан
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #5 : 10-10-2008 10:20 » 

Нумерацию лучше делать не  в цикле, а непосредственно в самом запросе к таблице.

select rownum, t.* from dual t;
Записан

Удачного всем кодинга! -=x[PooH]x=-
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 10-10-2008 10:58 » 

PooH, rownum это из Oracle
Код:
mysql> set @n=0;
mysql> select @n:=@n+1,foo from table where @n<5;
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines