2013-03-27 86 views
1

使用PHP並使用MYSQLI。嘗試從具有多個值的單個插入查詢中獲取插入的所有行的insert_id。保持一個呼籲的效率。我的實際代碼在一個插入查詢中有數百個值。然而,這裏是只有4個值插入一些示例代碼:獲取單個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; 

上面的代碼實現了插入,但只給了我從呼叫的第一個插入的ID。我怎樣才能檢索這個單一查詢的所有ID?

+2

據我所知,你不能使用批量插入。 – 2013-03-27 16:21:55

+1

他們使用自動增量嗎? – 2013-03-27 16:23:29

+1

是的,他們這樣做。這就是答案。只需要使用第一個insert_id並根據自動增量獲取其他值。謝謝! – 2013-03-27 16:40:09

回答

1

它應該是安全的假設,你的ID是mysql_insert_id +未來3(其他)在繼承,因爲你的發言都是在一個事務

1

做不,這是不可能與MySQL。

它甚至不能真正保存爲使用LAST_INSERT_ID(),因爲它將返回一個BIGINT(64位)值,表示爲AUTO_INCREMENT列成功插入的第一個自動生成的值。

你可以猜測,這個值+你的數據列表的長度將是ID的,但沒有任何絕對的保證,這將永遠是真實的。

+0

史蒂夫,你能否更詳細地闡述「沒有任何絕對的保證,這將永遠是真實的」?通過我如何理解批量插入,即使其他插入同時發生在同一個數據庫上,MySQL也會單獨處理這些調用。因此,如果我在單個呼叫中插入40個ID,則ID會自動遞增,基於該呼叫,對吧? – 2013-03-27 17:00:59

0

作爲@thomas pointed,我使用了這個解決方案,並假設它可以檢測最後一個插入ID;

$id = $link->insert_id; 
if ($id && $link->affected_rows > 1) { 
    $id = ($id + $link->affected_rows) - 1; // sub first id num 
} 

在你的情況(對於所有ID);

$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循環處理的結果,但沒有能達到預期的結果。

while ($link->more_results() && $link->next_result()) $ids[] = $link->insert_id;