如何在不使用 auto_increment 列的情況下在 MySQL 中創建標識欄位?
當使用者可以創建不同的對象並將它們與另一個對象相關聯時,我正在嘗試創建一個動態系統。
我需要的是能夠生成一個類似於 auto_increment 但採用字母數字格式的標識列。
id 將類似於 001abcdeFGhJk123
使用上面的 id 將幫助我辨識對象身份。例如,我可以說前 4 個字元是對象 ID,最後 14 個字元是記錄標識符。
我怎樣才能在 MySQL 中做到這一點。或者它甚至可能在 MySQL 中。我相信 MS SQL 伺服器和 Oracle 數據庫具有可以解決問題的標識符欄位類型。
先感謝您
您幾乎可以將任何欄位作為主鍵並對其進行索引。但是,這將取決於堆棧的更進一步的邏輯(您的腳本語言最有可能提供唯一的 ID。隨著數據庫的增長,您幾乎肯定會發現自己進行額外的查詢以查找未使用的 ID。
將字母數字轉換為數字的一種方法是
int(11) Auto
一個列和另一個列VarChar(18)
中的鍵表。因此,您實際上會在表上使用通用或花園數字鍵,但會讓使用者在鍵表中處理它們。您還將在所有表中擁有唯一的 ID,因此使用者鍵也將涉及表。簡單地將使用者密鑰設置為indexed, unique
意味著您將嘗試編寫密鑰,如果行插入成功,那麼您可以使用 ID(和/或密鑰取決於您在做什麼),但如果您失敗了將需要一個新的密鑰,並且可以反彈給使用者以獲取新的參考。但是,您是否考慮過在數據邏輯層中使用數字鍵,但在 UI 層中顯示使用者標籤,以便使用者可以呼叫他們的對象 Bob、Harry 或 Alpha123456FooBar1,而不需要奇怪的管道向下以適應它們。
在您的情況下,您希望向使用者顯示一個 concat 鍵,該鍵在數據層需要儲存為兩個單獨的鍵。這個 concat 鍵似乎從你所說的定義一個單一的一對一關係,這並不是它的工作。聽起來您想要的是關係的關鍵,這使我們回到查找表。在這裡,您將讓對象表使用數字鍵(來自對象和其他對象表)並提供唯一的文本值(MD5/SHA1/etc(鍵 concat)可能在 99.9% 的時間內工作)作為標籤被強制執行
index, unique
。您還可以將對象鍵的 int 大小限制為四位數(9999 個可能的條目),並且(我猜)在另一個表中使用 VarChar 鍵(如果必須的話)。因此,如果使用者請求 0001abceFGhJk123,您可以將其拆分為 0001 (1) 和 abceFGhJk123。
這遠非理想,因為數字自動提供的鍵更容易處理。然後,如果這對您真的很重要,您可以再次創建一個單獨的鍵和連接鍵/標籤的查找表(根據我之前提到的通用 ID)。
一種解決方法(如果您確定使用者必須能夠擁有字母數字鍵但您知道數字鍵在數據層更容易)是在數據層使用數字鍵並將數字基數轉換為顯示字母使用者。例如,轉移到 base16 會給你 0-9 和 af(不區分大小寫),這種轉換內置於大多數語言中,或者 base36 會給你 0-9 和 az(不區分大小寫),而 base62 會給你 0- 9 az 和 AZ 雖然說實話,您需要一個非常龐大的數據集來製作一個 14 個字元的數據存根,該存根大部分沒有用零填充。MySQL 允許您使用自己的數字覆蓋 auto 值(假設它尚不存在),並且如果這些鍵值來自使用者從 base 轉移到 base10 可能會起作用。
無論您使用哪種方法,您都會非常感謝您在數據庫層保持簡單,並將您的鍵與實際的主鍵數據分開。