[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как правильно получить new ID поля auto_increment?
Sylex
Вот была такая проблема... Может просто не выбран правильный способ, но мне кажется должен существовать способ.
В общем есть таблица, в которой ID (поле INT auto_increment Primary key) привязываю к файлу. Т.е. при добавлении файла через форму в БД запиывается ID и расширение файла. Полный путь к файлу выходит таким образом:

Код
/каталог/ID.расширение


Проблема возникла вот в чем. Как определить, когда сохраняю файл, с каким именем его сохранять? Например, есть 4 записи, тогда следующий ID будет 5. Т.е. называем файл 5.расширение. Как корректно определить эту цифру 5?

Есть SQL-функция MAX(), т.е. запрашиваю
Код
SELECT max(ID)+1 FROM MyTable;


Вроде бы это должен быть новый ID, который будет при вставке. И все работает. smile.gif НО! Если удалить к примеру ВСЕ строки из таблицы, то новый ID будет продолжать считать! Скажем, если было 6 записей и их все удалить. То новый ID будет 7, а не 1! И естественно запрос, который я привел в данном случае, возвращает 1, а не 7. Может есть какая-то другая функция?

Есть функция LAST_INSERT_ID(). Но она работает только сразу после вставки данных. Т.е. как вариант - сначала записывать в БД, а потом вызывать move_upload_file. Но если move_upload_file по каким-либо причинам вызовет ошибку? Т.е. надо удалять запись из БД. Как-то некорректно совсем.

Подскажите как вы делаете в данном случае и есть ли такая функция.



Спустя 2 часа, 42 минуты, 8 секунд (15.02.2008 - 10:01) mechanic написал(а):
InnoDB-таблица
начинаем транзакцию
вставка записи
получение last_insert_id()
если move_uploaded_file() == false -> rollback
иначе commit
smile.gif

Спустя 3 минуты, 50 секунд (15.02.2008 - 10:04) mechanic написал(а):
последний ID в любом случае лучше получать ф-цией last_insert_id, ибо надежнее, чем самопальные алгоритмы-попытки определить его
какой-то LOCK таблиц тоже желательно использовать, если системой будет пользоваться несколько человек одновременно
если innodb не катит, можно ввести столбец для флага активности и задействовать примерно следующий алгоритм:
вставить запись с флагом "Неактивна", и если move_uploaded_file() != false -> проапдейтить флаг на активный

Спустя 40 минут, 37 секунд (15.02.2008 - 10:45) Sylex написал(а):
Цитата(mechanic @ 15.2.2008, 13:01) [snapback]33624[/snapback]
InnoDB-таблица
начинаем транзакцию
вставка записи
получение last_insert_id()
если move_uploaded_file() == false -> rollback
иначе commit
smile.gif


Спасибо. Значит вариант - использование транзакцийsmile.gif.

Спустя 2 минуты, 35 секунд (15.02.2008 - 10:48) vasa_c написал(а):
Цитата
Есть функция LAST_INSERT_ID(). Но она работает только сразу после вставки данных. Т.е. как вариант - сначала записывать в БД, а потом вызывать move_upload_file. Но если move_upload_file по каким-либо причинам вызовет ошибку? Т.е. надо удалять запись из БД. Как-то некорректно совсем.

Корректо. Более того, в основном так и делают.
Кстати, ознакомьтесь с функцией mysql_insert_id

Спустя 4 минуты, 12 секунд (15.02.2008 - 10:52) Sylex написал(а):
Цитата(vasa_c @ 15.2.2008, 13:48) [snapback]33627[/snapback]
Цитата
Есть функция LAST_INSERT_ID(). Но она работает только сразу после вставки данных. Т.е. как вариант - сначала записывать в БД, а потом вызывать move_upload_file. Но если move_upload_file по каким-либо причинам вызовет ошибку? Т.е. надо удалять запись из БД. Как-то некорректно совсем.

Корректо. Более того, в основном так и делают.
Кстати, ознакомьтесь с функцией mysql_insert_id


Знаком с функцией mysql_insert_id. Таже тока PHP:). Спасибо!


_____________
Я думал я буду сеять добро, но у меня не получилось. Во-первых, мне помешали, во-вторых я сам отрекся от этой идеи.
Быстрый ответ:

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