Я думаю, вам придется либо обрабатывать идентификатор транзакции в вашем приложении, либо идентификатор элемента в вашем приложении, чтобы сделать это безупречно.
Один из способов сделать это, который может работать, при условии, что всеВаши вставки успешны (!), следующие:
Затем вы можете получить вставленные идентификаторы с циклом для числа затронутых строк, начиная с lastid (который является первым вставленным идентификатором массовой вставки).И, таким образом, я проверил, что это работает отлично ... просто будьте осторожны, например, HeidiSQL не вернет правильное значение для ROW_COUNT (), вероятно, потому что это дерьмовый графический интерфейс, который делает случайное дерьмо, мы его не просим - однако это совершенно правильно с обеих сторон.командная строка или PHP mysqli -
START TRANSACTION;
BEGIN;
INSERT into test (b) VALUES ('1'),('2'),('3');
SELECT LAST_INSERT_ID() AS lastid,ROW_COUNT() AS rowcount;
COMMIT;
В PHP это выглядит так (local_sqle - это прямой вызов mysqli_query, local_sqlec - это вызов mysqli_query + преобразование набора результатов в массив PHP):
local_sqle("START TRANSACTION;
BEGIN;
INSERT into test (b) VALUES ('1'),('2'),('3');");
$r=local_sqlec("SELECT LAST_INSERT_ID() AS lastid,ROW_COUNT() AS rowcount;");
local_sqle("
COMMIT;");
$i=0;
echo "last id =".($r[0]['lastid'])."<br>";
echo "Row count =".($r[0]['rowcount'])."<br>";
while($i<$r[0]['rowcount']){
echo "inserted id =".($r[0]['lastid']+$i)."<br>";
$i++;
}
Причина, по которой запросы разделяются, заключается в том, что иначе я бы не получил свой результат, используя свои собственные функции. Если вы сделаете это со стандартными функциями, вы можете поместить его обратно в один оператор, а затем получить нужный вам результат (это должнобыть результатом номер 2 - при условии, что вы используете расширение, которое обрабатывает более одного результирующего набора / запроса).