Tôi nghĩ rằng bạn sẽ phải hoặc là xử lý các id giao dịch trong ứng dụng của bạn, hoặc id mục trong bạn ứng dụng để làm điều này hoàn hảo. (!)
Một cách để làm điều này mà có thể làm việc, giả định rằng tất cả chèn của bạn thành công, như sau:
Bạn có thể sau đó nhận của chèn id với một vòng lặp cho số hàng bị ảnh hưởng, bắt đầu với lastid (là id được chèn đầu tiên của chèn số lượng lớn). Và do đó, tôi đã kiểm tra nó hoạt động hoàn hảo .. chỉ cần cẩn thận rằng HeidiSQL chẳng hạn sẽ trả về giá trị đúng cho ROW_COUNT(), có lẽ bởi vì nó là một giao diện crappy làm việc ngẫu nhiên, chúng tôi không hỏi nó - tuy nhiên nó hoàn toàn chính xác một trong hai dòng lệnh hoặc PHP mysqli -
START TRANSACTION;
BEGIN;
INSERT into test (b) VALUES ('1'),('2'),('3');
SELECT LAST_INSERT_ID() AS lastid,ROW_COUNT() AS rowcount;
COMMIT;
Trong PHP nó trông như thế này (local_sqle là lời kêu gọi thẳng đến mysqli_query, local_sqlec là một lời kêu gọi mysqli_query + chuyển đổi resultset để PHP mảng):
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++;
}
Lý do các truy vấn được tách ra là bởi vì tôi sẽ không nhận được kết quả của tôi bằng cách sử dụng các chức năng của riêng tôi, nếu yo u làm điều này với các hàm chuẩn, bạn có thể đặt nó trở lại trong một câu lệnh và sau đó lấy kết quả bạn cần (nó sẽ là kết quả số 2 - giả sử bạn sử dụng phần mở rộng xử lý nhiều hơn một tập kết quả/truy vấn).
Nguồn
2011-09-23 10:04:52
Tại sao bạn không thể chèn từng cái một? – sanmai
Bạn cần mô phỏng mệnh đề 'OUTPUT'. Tôi tin rằng bạn có thể làm điều này với một kích hoạt trong MySQL –
Bạn không thể sử dụng chèn số lượng lớn và sau đó một hàm lime last_insert_id(), nó không hoạt động. –