數據庫MySQL的= =語言PHP如何從獲得錯誤的ID
我編碼這樣的程序
PC1工作防止=電腦1
一步
1.PC1插入數據,自動增量的新ID。
2.PC1選擇最後一個ID
一切工作正常,但..
的問題,當你的代碼是在同一毫秒使用多臺計算機。 例如
- PC1insert數據,自動增加新的ID
2.PC2插入數據,自動增加新的ID
3.PC1選擇最後一個ID < ----- --Wrong
4PC2選擇最後一個ID
如何配置數據庫或修改PHP代碼以防止這種情況,三江源。
數據庫MySQL的= =語言PHP如何從獲得錯誤的ID
我編碼這樣的程序
PC1工作防止=電腦1
一步
1.PC1插入數據,自動增量的新ID。
2.PC1選擇最後一個ID
一切工作正常,但..
的問題,當你的代碼是在同一毫秒使用多臺計算機。 例如
2.PC2插入數據,自動增加新的ID
3.PC1選擇最後一個ID < ----- --Wrong
4PC2選擇最後一個ID
如何配置數據庫或修改PHP代碼以防止這種情況,三江源。
您應該使用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值,並且在查詢之間不會重置。
或PDO :: lastInsertID()/ mysqli_insert_id,具體取決於選擇的連接。但實際上這個值是會話安全的。 – Wrikken 2010-09-14 09:39:14
小心:根據文檔,應在插入查詢後立即調用mysql_insert_id(),而只要它是相同的連接,mySQL的'LAST_INSERT_ID()'可以稍後調用。 – 2010-09-14 09:52:09
我已將文檔中的警告添加到我的答案中。 – 2010-09-14 10:15:56
如果您撥打
SELECT LAST_INSERT_ID()MySQL的;
您將獲得最後一個自動生成的ID爲當前連接,而不是整個服務器。因此,如果在另一個連接中創建另一條記錄,它不會影響LAST_INSERT_ID()返回的結果。
MySQL將在每個客戶端(計算機)連接的任何INSERT
語句之後返回正確的最後插入的ID,因此您不必擔心;服務器不會混淆它們。來自documentation:
每個客戶端都會收到最後插入的客戶端執行語句的ID。
只要您在您的PHP代碼中調用mysql_insert_id()
來檢索插入ID,沒有什麼可擔心的。
mySQL具有LAST_INSERT_ID()
功能。
的PHP當量(如果你使用MySQL的經典功能)是mysql_insert_id()
不同之處在於這個功能應該插入查詢後,因爲它作用於的最後一次查詢被稱爲立即。
這些功能基於每個連接的基礎上,它不會受到其他客戶端插入的記錄的影響。
你可以發佈你的代碼如何獲取最後的ID? – sheeks06 2010-09-14 09:38:26
我還沒有完成代碼,我只是認爲它可能會導致我編碼時出現問題。 – user447172 2010-09-14 09:49:23