2012-10-24 32 views
1

跳到問題底部的「我的代碼」以直接找到要點。對於每行,使用LAST_INSERT_ROW的單個MySQL多行INSERT的PHP?


$con = mysql_connect('localhost', 'mysql_user', 'mysql_password');


常見的例子:

多個查詢字符串可以在單個mysql_query內執行,這樣的...

mysql_query(" 
    INSERT INTO table_one (a,b,c) VALUES (1,2,3); 
    INSERT INTO table_two (x,y,z) VALUES (7,8,'a text value'); 
    ", $con); 

多行可以被添加到每個查詢串,像這樣...

mysql_query(" 
    INSERT INTO table_one (a,b,c) VALUES (1,2,3), (2,3,1), (3,1,2); 
    INSERT INTO table_two (x,y,z) VALUES (7,8,9), (8,9,7), (9,7,8); 
    ", $con); 

隨着值的陣列,像這樣...

$array(
    [0] => array(1,2,3), 
    [1] => array(2,'text',1), 
    [2] => array(3,1,2) 
); 

...查詢字符串可以動態使用循環,像這樣...

$a = "INSERT INTO table_one (a,b,c) VALUES "; 
foreach($array as $val){ 
    $a .= "(". implode(",",$val) ."),"; 
} 
$a = trim($a, ",") . ";"; 

問題產生:

如何編寫一個執行多個INSERT查詢字符串的單個MySQL查詢,每個查詢字符串都有多行,以便第二個查詢字符串插入的每行都可以引用由第一個查詢字符串插入的相應行。因此,此片段中的$var將對應於第一個INSERT的auto_increment行ID。

mysql_query(" 
    INSERT INTO table_one (a,b,c) VALUES (1,2,3), (2,3,1), (3,1,2); 
    INSERT INTO table_two (x,y,z) VALUES ($var,8,9), ($var,9,7), ($var,7,8); 
    ", $con); 

我的代碼:

這是一個簡化版本,我的代碼...

什麼是安全產生$row_ID_from_first_insert方式?

根據我的理解,在查詢字符串中使用LAST_INSERT_ID()將不起作用,因爲當多個行插入一個查詢字符串時,它只會返回第一個插入的行ID。是否可以安全使用LAST_INSERT_ID()+1,其中1在foreach循環中被一個增量變量替換?如果多個提交同時發生在不同的用戶上,該怎麼辦?

+2

請不要在新的應用程序中使用'mysql_query'。正確使用非常困難,並且可能導致[SQL注入漏洞](http://bobby-tables.com/php)出現嚴重的**問題。學習PDO或'mysqli'只需要很短的時間,這使得編寫適當的,安全的SQL接口代碼變得非常容易。 – tadman

回答

2

一般來說,您必須取回插入行的id值。這是除非您可以創建另一個用於替代可以事先程序化生成的密鑰。

雖然具有多行的INSERT語句顯着更快,但您付出的代價是精度不夠。如果您的id值是按順序發出的,這是默認行爲,那麼您可以合理地確信LAST_INSERT_ID()表示插入的第一行的ID,因此您可以使用您建議的方法計算行的ID,但啓動在索引0.

請記住,多個提交不影響LAST_INSERT_ID()結果,因爲此值是每個連接。只有在相同數據庫句柄上執行後續查詢時纔會更改。其他請求中的操作不會影響它。

羣集或多主數據庫可能會發出非順序標識符,在這種情況下這不起作用。這在INSERT IGNORE的情況下也不可靠,在這種情況下,實際插入的行數可能少於提供的行數。

0

LAST_INSERT_ID()在每個來自同一連接句柄的成功查詢結束時生成。因此,你的示例代碼不會給你你正在尋找的結果。見下文:

mysql_query(" 
    INSERT INTO table_two (x,y,z) VALUES (LAST_INSERT_ID(),8,9), (LAST_INSERT_ID(),9,7), (LAST_INSERT_ID(),7,8); 
", $con); 

上述結果將是(其中,x是的值LAST_INSERT_ID()產生):

x y z 
5 8 9 
5 9 7 
5 7 8 

要接收你所尋求的結果,使用你在你的實施例中使用相同的格式(我不建議對SQL注入的風險 - 使用的mysqli代替)你可以這樣做:

mysql_query(" 
    INSERT INTO table_two (x,y,z) VALUES (LAST_INSERT_ID(),8,9); 
    INSERT INTO table_two (x,y,z) VALUES (LAST_INSERT_ID(),9,7); 
    INSERT INTO table_two (x,y,z) VALUES (LAST_INSERT_ID(),7,8); 
", $con); 

這會給你(其中x是值LAST_INSERT_ID()產生):

x y z 
5 8 9 
6 9 7 
7 7 8