2013-10-16 84 views
0

所以我想鏈接兩個表與一個公共列「messageID」。所以首先我插入到表1 獲得自動遞增的ID,然後採取與LAST_INSERT_ID功能ID,並給,作爲ID爲表2:LAST_INSERT_ID更可靠的解決方案

$db->("INSERT INTO table_1 VALUES('','$message')"); 
$db->("INSERT INTO table_2 VALUES(LAST_INSERT_ID(),'$message'); 

但這裏是我關心的,有可能是運行兩個用戶這個腳本是同時發生的,所以在兩個查詢之間的幾毫秒之間,可以改變LAST_INSERT_ID,所以現在這兩個id是不同的。有什麼辦法可以阻止這種可能性嗎?我知道不可能用一個查詢插入兩個表格,這是我的第一個想法。任何想法非常讚賞。謝謝

+3

注意你**不**在第二個查詢中插入最後一個插入標識。你插入一個** STRING **,碰巧說出「last_insert_id」。你想''VALUES(last_insert_id(),'$ message')'代替。不是缺乏引號,而是增加了「()」。 –

+0

很對,我忘了參數 – user2014429

回答

6

LAST_INSERT_ID對於連接會話是本地的,所以它不會與不同的用戶進行插入衝突。

+0

男人......你很快。 – Parziphal

+2

連接會話不是事務。 –

+0

這是我的頭腦的一個重量,謝謝你的好消息。 – user2014429

1

你可以嘗試使用SCOPE_IDENTITY,這將是這樣的:

$db->("DECLARE @LAST_ID int 
INSERT INTO table_1 VALUES('','$message')" 
SET @LAST_ID = SCOPE_IDENTITY() 
); 

$arg = ... $myARR['LAST_ID'] ... //however you want to get the LAST_ID from your query to PHP here 

$db->("INSERT INTO table_2 VALUES(@arg,'$message'); 

$db->("DECLARE @LAST_ID int 
INSERT INTO table_1 VALUES('','$message')" 
SET @LAST_ID = SCOPE_IDENTITY() 
INSERT INTO table_2 VALUES(@LAST_ID,'$message') 
); 

LAST_ID將是自動的價值遞增ID

+1

SCOPE_IDENTITY()是Microsoft SQL Server中的一個函數,不在MySQL中。 –