Я думаю, вам придется либо обрабатывать идентификатор транзакции в вашем приложении, либо идентификатор элемента в вашем приложении, чтобы сделать это безупречно.
Один из способов сделать это, который может сработать, если все ваши вставки выполнены успешно (!), Заключается в следующем:
Затем вы можете получить вставленные идентификаторы с помощью цикла для количества затронутых строк, начиная с 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 - при условии, что вы используете расширение, которое обрабатывает более одного набора результатов / запросов).
person
Morg.
schedule
23.09.2011
OUTPUT
. Я считаю, что вы можете сделать это с помощью триггера в MySQL - person Martin Smith   schedule 07.09.2011last_insert_id()
), а не одного - person Lukas Eder   schedule 07.09.2011SELECT * FROM INSERTED
, чтобы вернуть новые идентификаторы клиенту. Тогда разве это невозможно в MySQL? - person Martin Smith   schedule 07.09.2011INSERT .. RETURNING *
, чтобы вернуть все только что вставленные строки. MySQL не имеет такого предложения. С помощью JDBC вы почти всегда можете получить все автоматически сгенерированные идентификаторы, но здесь не обязательно речь идет о JDBC. Подождем и посмотрим - person Lukas Eder   schedule 07.09.2011