(mysql, php) Как получить значение поля auto_increment перед вставкой данных?

Я загружаю файл изображения на сервер хранения. Перед загрузкой я должен написать имя файла, содержащее в нем значение AUTOINCREMENT VALUE (например, 12345_filename.jpg).

Как я могу получить значение автоинкремента перед вставкой в ​​БД?

Я вижу только одно решение

  • вставить пустую строку
  • получить значение автоинкремента
  • удалить эту строку
  • введите строку с реальными данными, используя значение автоинкремента из p.1

Есть ли другие решения?

Спасибо

Ответ 1

Значение автоинкремента генерируется самой базой данных, когда выполняется вставка; что означает, что вы не можете получить его, прежде чем делать фактический запрос вставки.

Решение, предложенное вами, не является тем, которое часто используется, - это будет:

  • вставьте некоторые полупустые данные
  • получить полученное значение автоинкремента
  • выполните ваши вычисления, используя значение автоинкремента
  • обновите строку, чтобы поместить новые/полные данные на место - с помощью автоинкремента, сгенерированного ранее в предложении 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

Ответ 2

ну, попробуйте следующее:

$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.

Ответ 3

Нет решения. Вы получаете значение автоинкремента при вставке новой строки, полной остановки. Вставка и удаление не помогут, так как следующее значение автоинкремента будет выше. Сделайте, возможно, несколько клиентов, одновременно разговаривающих с базой данных, вы не можете предсказать следующее значение, так как оно может увеличиваться между вашими предположениями и фактической вставкой.

Найдите другое решение. Либо вставьте строку и обновите ее позже, либо создайте идентификатор для имени файла, который не зависит от идентификатора автоматического инкремента.

Ответ 4

@Паскаль Мартин отлично подходит. В подобных случаях мне лично нравится добавить еще один столбец идентификаторов, содержащий случайный 16-значный идентификатор (который также будет "общедоступным" ID в веб-приложениях и на веб-сайтах по соображениям безопасности). Этот случайный идентификатор, который вы можете заранее установить в своем приложении, работать с ним, а затем установить, когда запись фактически создана.

Ответ 5

INSERT INTO CONTACTS1 (firstname, lastname) значения ('hi', выберите auto_increment из information_schema.TABLES, где TABLE_NAME = 'CONTACTS1' и TABLE_SCHEMA = 'test')

Где идентификатор - это столбец Первичный ключ и автоматический номер.

Ответ 6

Если вы используете PDO, вот однолинейное решение:

$nextId = $db->query("SHOW TABLE STATUS LIKE 'tablename'")->fetch(PDO::FETCH_ASSOC)['Auto_increment'];

где tablename заменяется вашей таблицей.

Ответ 7

Используйте отдельную таблицу как счетчик, как последовательность postgresql, и не используйте auto_increment в своей основной таблице.

Ответ 8

Ну, это старый, но если кому-то это нужно.

Вы можете получить такое значение в таблице information_schema, где вы можете сделать что-то вроде

select AUTO_INCREMENT from TABLES where TABLE_SCHEMA = 'You're Database' and TABLE_NAME = 'Table Name'

Таким образом, этот вид метаданных всегда хранится в Information_schema.

Ответ 9

Используйте mysql_insert_id(), чтобы получить последний идентификатор, а затем + 1