Я загружаю файл изображения на сервер хранения. Перед загрузкой я должен написать имя файла, в котором содержится AUTOINCREMENT VALUE (например, 12345_filename.jpg).
Как я могу получить значение автоинкремента перед вставкой в БД?
Я вижу только одно решение
Есть ли другие решения?
спасибо
Значение автоинкремента генерируется самой базой данных, когда выполняется вставка; что означает, что вы не можете получить его, прежде чем делать фактический запрос на вставку.
Предлагаемое вами решение – это не тот, который часто используется, – который будет:
where
запроса update
, чтобы определить, какая строка обновляется. Конечно, в качестве меры предосторожности все эти операции должны выполняться в транзакции (чтобы обеспечить поведение «все или ничего»)
Как псевдокод:
begin transaction insert into your table (half empty values); $id = get last autoincrement id do calculations update set data = full data where id = $id commit transaction
хорошо, попробуйте это:
$query = "SHOW TABLE STATUS LIKE 'tablename'"; $result = mysql_query($query); $row = mysql_fetch_assoc($result); var_dump($row);
вывод:
array(18) { [...] ["Auto_increment"]=> string(4) "3847" [...] }
Это будет ваш следующий идентификатор auto_increment.
Нет решения. Вы получаете значение автоинкремента при вставке новой строки, полной остановки. Вставка и удаление не помогут, так как следующее значение автоинкремента будет выше. Сделайте, возможно, несколько клиентов, одновременно разговаривающих с базой данных, вы не можете предсказать следующее значение, так как оно может быть увеличено между вашими догадками и фактической вставкой.
Найдите другое решение. Либо вставьте строку, либо обновите ее позже, либо создайте идентификатор для имени файла, который не зависит от идентификатора автоматического инкремента.
@Pascal Martin делает хороший момент. В подобных случаях мне лично нравится добавить еще один столбец идентификаторов, содержащий случайный 16-значный идентификатор (который также будет «общедоступным» ID в веб-приложениях и на веб-сайтах по соображениям безопасности). Этот случайный идентификатор, который вы можете заранее установить в своем приложении, работать с ним, а затем установить, когда запись фактически создана.
INSERT INTO CONTACTS1 (firstname, lastname) ('hi', выберите auto_increment из information_schema.TABLES, где TABLE_NAME = 'CONTACTS1' и TABLE_SCHEMA = 'test')
Где ID – столбец Первичный ключ и номер авто.
Если вы используете PDO , вот однолинейное решение:
$nextId = $db->query("SHOW TABLE STATUS LIKE 'tablename'")->fetch(PDO::FETCH_ASSOC)['Auto_increment'];
где tablename
заменяется вашей таблицей.
Используйте отдельную таблицу так же, как счетчик, как последовательность postgresql, и не используйте auto_increment в своей основной таблице (таблицах).
Ну, это старый, но если кому-то это нужно.
Вы можете получить такую ценность в таблице « information_schema », где вы можете сделать что-то вроде
select AUTO_INCREMENT from TABLES where TABLE_SCHEMA = 'You're Database' and TABLE_NAME = 'Table Name'
Таким образом, этот вид метаданных всегда хранится в Information_schema.
Используйте mysql_insert_id()
чтобы получить последний идентификатор, а затем + 1