(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