我使用這個查詢將數據插入到兩個不同的表:Mysql事務,在第二個和第三個查詢中都使用LAST_INSERT_ID()?
$query1="INSERT INTO node (cid, title) VALUES('$cid','$title')";
$query2="INSERT INTO location (nid, street, city, state) VALUES(LAST_INSERT_ID(),'$address', '$city','$state')";
$result = FALSE;
if (mysql_query('BEGIN')) {
if (mysql_query($query1) &&
mysql_query($query2))
$result = mysql_query('COMMIT'); // both queries looked OK, save
else
mysql_query('ROLLBACK'); // problems with queries, no changes
}
基本上,第一個查詢投擲數據到節點表這又增加一個NID字段。這個NID用於第二個查詢(我的位置表)。
現在我已經改變了我的網站了一點,我也想插入相同的NID到第三個表中。問題是第二個查詢(位置表)也有一個ID列(LID)auto_increments,所以如果我嘗試使用last_insert_ID它只會給我LID而不是NID。
我在想我可以在事務之外做第三個查詢,在那裏我會查詢數據庫並獲取正確的nid,但是我想保留它在事務中以防止任何混淆。有任何想法嗎?
將['mysql_insert_id()'](http://php.net/manual/en/function.mysql-insert-id.php)的結果存儲在一個PHP變量中,然後在後續的INSERT中使用它'陳述。 – eggyal
我可以在交易中存儲嗎?這兩個查詢都沒有實際運行,直到它們被提交,那麼我將它存儲在哪裏? – Jay
實際上,查詢*執行時執行 - 它們只是不提交*(在事務外部存在),直到您明確提交。尤其是,即使事務回滾了,ids也會增加 - 參見['InnoDB'中的'AUTO_INCREMENT'處理](http://dev.mysql.com/doc/en/innodb-auto-increment-handling.html) :「*如果使用計數器回滾已生成數字的事務,則可能會在分配給」AUTO_INCREMENT「列的值序列中看到空位。*」 – eggyal