Я думаю, вам доведеться обробляти ідентифікатор транзакції у вашій програмі або ідентифікатор товару у вашій програмі, щоб зробити це бездоганно.
Один із способів зробити це, який міг би спрацювати, припускаючи, що всі ваші вставки успішні (!), Є наступний:
Потім ви можете отримати вставлені ідентифікатори з циклом для кількості уражених рядків, починаючи з 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 - припускаючи, що ви використовуєте розширення, яке обробляє більше одного набору результатів / запиту).