2010-12-04 183 views
1

我目前正在使用ASP和MySQL的大型網站項目。 當插入到多個表中時,我一直在使用last_update_ID(),但經過一番研究後,我發現該SQL語句不安全。是否有任何替代mySQL的「last_update_ID()」?

所以。問題: 我使用兩臺不同的計算機,使用不同的互聯網連接。
兩臺電腦都登錄到我目前正在建造的系統上。我製作了一個打印connection_id()和last_update_id的頁面。
如果我用其中一臺計算機更新任何表,另一臺也會得到last_update_ID。 兩臺計算機都有相同的connection_ID。

我能做些什麼來解決這個問題?

我不想(如果它不是必需的)做的第一INSERT後的select語句;搜索我插入的行,以獲取該行的正確ID。

這不是我使用的服務器,所以我無法對數據庫進行任何大的更改。
我想這個問題是因爲網頁使用相同的loginName &密碼連接到數據庫,是真的嗎?

是否有任何其他替代方法來獲取最新的更新ID?這是完全安全的。 我關閉了asp頁面末尾的每個連接。但是這不會改變connection_ID。
即使您在服務器上打開不同的網頁,連接ID也是幾分鐘。

回答

3

我相信LAST_INSERT_ID()對於當前會話是正確的。所以每個會話都會收到它自己的正確值。要麼我不明白你的問題,要麼你認爲你有問題,但你不知道。

,我不知道有任何LAST_UPDATE_ID()函數,在更新,你可以很容易地用相同的WHERE子句選擇它們(更新前)檢索更新行?

參考:http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html

對於LAST_INSERT_ID(),最 最近生成的ID被保持在 服務器上的每個連接的基礎。 它不會被另一個客戶端更改。 它,如果你更新 與 值魔法的另一個AUTO_INCREMENT列也不變化(即值 不爲NULL,而不是0)。同時使用 LAST_INSERT_ID()和AUTO_INCREMENT 列來自多個 客戶端是完全有效的。每個 客戶端將收到最後插入 ID爲最後一條語句 客戶端執行。


如果你想從一個對重複KEY UPDATE子句的INSERT查詢檢索LAST_INSERT_ID,您還可以使用LAST_INSERT_ID()函數來檢索已更新的AUTO_INCREMENT列的值:

參考:http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

如果表中包含一個AUTO_INCREMENT 柱和INSERT ... UPDATE插入 排,LAST_INSERT_I D()函數 返回AUTO_INCREMENT值。如果 該語句改爲更新一行,則 LAST_INSERT_ID()無意義。 但是,您可以使用LAST_INSERT_ID(expr)通過 解決此問題。假設 這個id是AUTO_INCREMENT列。 爲了使LAST_INSERT_ID()更新有意義 ,如下插入行:

INSERT INTO table (a,b,c) VALUES (1,2,3) 
    ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3; 
+0

其實我仍然認爲我有一個問題..我使用2個不同的計算機和2個不同的互聯網連接,我仍然能夠從另一臺計算機檢索last_update_ID(),當我更新或插入表中。 – Matte 2010-12-05 10:41:20

1

你的服務器似乎有連接池打開。這意味着數據庫連接在腳本完成後保持打開狀態,隨後出現的下一個腳本使用它,因此可以看到在該連接上設置的任何變量,包括LAST_INSERT_ID()

什麼不能發生是兩個腳本實例在同一時間共享連接。因此,如果您的服務器足夠忙,需要在同一時間運行兩個腳本實例,則它將簡單地創建第二個數據庫連接,並擁有自己獨立的變量LAST_INSERT_ID(),並且不會干擾第一個。

簡而言之,只要INSERTLAST_INSER_ID()請求在同一個腳本內發生(並且您不會以某種方式關閉它們之間的數據庫連接),它們就完全安全了,因爲腳本專用了連接。

相關問題