[英]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.