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

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

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

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

  1. вставить пустую строку
  2. получить значение автоинкремента
  3. удалить эту строку
  4. вставить строку с реальными данными с использованием значения автоинкремента из p.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 

хорошо, попробуйте это:

 $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