簡體   English   中英

MySQL的自動增量ID與PHP生成的ID

[英]mysql autoincrement id vs php generated id

到現在為止,我一直通過使用php生成ID(varchar 32主鍵)來將記錄存儲在mysql數據庫中,其功能如下:

$id = substr( str_shuffle( abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ), 0, 8 );

但是直到現在,在mysql DB中我一直使用utf8_bin(區分大小寫),現在我使用utf8_general_ci(不區分大小寫)。

我的數據庫中有一個表可以存儲統計信息,該表中有數百萬條記錄。

在這種情況下,最好使用:'id int unsigned autoincrement'作為主鍵?

如果是,是否有可能,如果許多用戶同時調用sciprt,腳本會因“重復ID”錯誤而崩潰嗎? 以及我如何避免這種情況?

在我看來,使用mysql自動增量會更好,因為現在您的php腳本可以同時被多個人訪問。 因此,id可能不再是唯一的。 而且我很確定mysql編程的很好,以至於它禁止相同的id;)

實際上,您當前的代碼具有可能再次生成相同ID的錯誤。 MySQL生成的ID沒有這個問題。 即使您有理由生成自己的ID,由於索引(速度)更好,我仍將使用MySQL自動增量整數在表之間進行鏈接。

並且,例如,如果您想向用戶隱藏序列,請將其保留在具有唯一索引的單獨列中。 並執行ID生成並插入do while循環中,因此,如果您第二次碰巧生成相同的ID,則可以重試。

即使有幾個人可以一次訪問該站點,但是MySQL仍將順序處理表中的插入並將其收到的請求排隊。 因此,在插入查詢中,如果未提供ID,則會生成一個自動遞增的ID,然后保存並提交該行。 並且隊列中的下一個請求將被處理。 自動遞增的ID不可能如此重復。

此外,您的代碼生成隨機字符串,而不是唯一字符串。 兩者之間有很多區別。 很有可能生成一個先前生成的隨機字符串序列。

另一方面,自動增量是逐漸增加的順序,無法確保沒有機會獲得重復的密鑰。 因此,始終建議使用自動增量來生成主密鑰而不是生成自己的主密鑰。

為了獲取最后生成的MySQL ID,您可以在PHP中的插入查詢之后立即使用mysqli_insert_id() ,並在代碼中使用它,以便隨后針對插入的行與MySQL進行交互。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM