Работа в PHP и использование MYSQLI. Попытка получить insert_id для всех строк, вставленных из одного запроса на вставку с несколькими значениями. Сохраняя его в едином призыве к эффективности. Мой фактический код содержит сотни значений в одном запросе на вставку. Однако здесь приведен пример кода для вставки с четырьмя значениями:
$sql = "INSERT INTO link_tags ( string_names_id, urls_id ) VALUES ( '2', '17' ), ( '8', '31' ), ( '8', '1' ), ( '8', '4' )"; $mysqli->query($sql); echo "id's: " .$mysqli->insert_id;
Вышеприведенный код достигает вставки, но дает мне только идентификатор первой вставки из вызова. Как я могу получить все идентификаторы для этого единственного запроса?
Следует с уверенностью предположить, что ваши идентификаторы – mysql_insert_id + следующие 3 (независимо) подряд, так как ваш оператор выполняется в одной транзакции
Нет, это невозможно с MySQL.
Его даже не позволяет сохранить LAST_INSERT_ID()
поскольку он вернет значение BIGINT (64-разрядное), представляющее первое автоматически сгенерированное значение, успешно вставленное для столбца AUTO_INCREMENT.
Вы могли догадаться, что это значение + длина вашего списка данных будет идентификатором, но нет абсолютной гарантии, что это всегда будет верно.
Как указал @thomas, я использовал это решение и предположил, что нормально обнаруживать последний идентификатор вставки;
$id = $link->insert_id; if ($id && $link->affected_rows > 1) { $id = ($id + $link->affected_rows) - 1; // sub first id num }
В вашей ситуации (для всех идентификаторов);
$id = $link->insert_id; $ids = [$id]; if ($id && $link->affected_rows > 1) { for ($i = 0; $i < $link->affected_rows - 1; $i++) { $ids[] = $id + 1; } } // or more dirty way $id = $link->insert_id; $ids = [$id]; if ($id && $link->affected_rows > 1) { $ids = range($id, ($id + $link->affected_rows) - 1); }
Между тем, я использовал multi_query
и обрабатывал результат во время цикла, но не смог достичь ожидаемого результата.
while ($link->more_results() && $link->next_result()) $ids[] = $link->insert_id;