2010-09-14 52 views
1

數據庫MySQL的= =語言PHP如何從獲得錯誤的ID

我編碼這樣的程序

PC1工作防止=電腦1

一步

1.PC1插入數據,自動增量的新ID。

2.PC1選擇最後一個ID

一切工作正常,但..

的問題,當你的代碼是在同一毫秒使用多臺計算機。 例如

  1. PC1insert數據,自動增加新的ID

2.PC2插入數據,自動增加新的ID

3.PC1選擇最後一個ID < ----- --Wrong

4PC2選擇最後一個ID

如何配置數據庫或修改PHP代碼以防止這種情況,三江源。

+1

你可以發佈你的代碼如何獲取最後的ID? – sheeks06 2010-09-14 09:38:26

+0

我還沒有完成代碼,我只是認爲它可能會導致我編碼時出現問題。 – user447172 2010-09-14 09:49:23

回答

3

您應該使用mysql_insert_id(或您使用的API的等效調用)來獲取最後插入的行的ID。

我想,你現在正在做這件事:

SELECT MAX(id) FROM yourtable 

這是行不通的,除非你使用的交易。但使用功能mysql_insert_id是更好的方法。


在documenation也有謹慎和一些注意事項,你應該閱讀:

注意:mysql_insert_id()將轉換爲原生的MySQL C API函數mysql_insert_id的返回類型( )改爲long類型(在PHP中名爲int)。如果AUTO_INCREMENT列的列類型爲BIGINT(64位),則轉換可能會導致錯誤的值。相反,在SQL查詢中使用內部MySQL SQL函數LAST_INSERT_ID()。

注意:由於mysql_insert_id()作用於上次執行的查詢,可以肯定的是產生價值的查詢之後立即調用mysql_insert_id()。

注意:MySQL SQL函數LAST_INSERT_ID()的值始終包含最近生成的AUTO_INCREMENT值,並且在查詢之間不會重置。

+0

或PDO :: lastInsertID()/ mysqli_insert_id,具體取決於選擇的連接。但實際上這個值是會話安全的。 – Wrikken 2010-09-14 09:39:14

+0

小心:根據文檔,應在插入查詢後立即調用mysql_insert_id(),而只要它是相同的連接,mySQL的'LAST_INSERT_ID()'可以稍後調用。 – 2010-09-14 09:52:09

+0

我已將文檔中的警告添加到我的答案中。 – 2010-09-14 10:15:56

2

如果您撥打

SELECT LAST_INSERT_ID()MySQL的;

您將獲得最後一個自動生成的ID爲當前連接,而不是整個服務器。因此,如果在另一個連接中創建另一條記錄,它不會影響LAST_INSERT_ID()返回的結果。

2

MySQL將在每個客戶端(計算機)連接的任何INSERT語句之後返回正確的最後插入的ID,因此您不必擔心;服務器不會混淆它們。來自documentation

每個客戶端都會收到最後插入的客戶端執行語句的ID。

只要您在您的PHP代碼中調用mysql_insert_id()來檢索插入ID,沒有什麼可擔心的。

2

mySQL具有LAST_INSERT_ID()功能。

的PHP當量(如果你使用MySQL的經典功能)是mysql_insert_id()不同之處在於這個功能應該插入查詢後,因爲它作用於的最後一次查詢被稱爲立即

這些功能基於每個連接的基礎上,它不會受到其他客戶端插入的記錄的影響。