2016-06-11 63 views
1

假設我有一個表格,例如以自動遞增6-8模式生成唯一編號mysql

id | memberName | memberPhoneNumber | prefix | suffix 

我想生成一個前綴和後綴作爲必須是6-8模式的組合鍵。我的主鍵仍然是ID。這兩列用作參考號碼,例如,

Prefix-Suffix 
000000-00000000 
000000-00000001 
000000-00000002 
... 
000000-99999999 
000001-00000000 
000001-00000001 
000001-00000002 
... 
567889-48329484 

依此類推。理想情況下,這會自動遞增。做這個的最好方式是什麼?我最初是通過一個登臺表來完成這個工作,我將填入一個我通過8模式的函數生成的數字,然後根據我存儲的登臺表的數量自動遞增數據庫之外的6模式前綴使用的數字,然後截斷它沖洗/重複,但我想要一個更簡單的自動遞增解決方案。這可能嗎?

我一直在閱讀組合鍵,但由於我已經有一個主鍵是獨特的,不會被使用,我不確定我如何能夠做我的當前方法之外。

有什麼想法?

回答

0

您的前綴後綴模式相當於一個正常的整數主鍵。

想象一下,你有一個數字的後綴長度(而不是你的例子中的八個)。這將使解釋更容易。

prefix | suffix | key 
000000 | 0  | 0 
000000 | 1  | 1 
000000 | 2  | 2 
... 
000000 | 9  | 9 
000001 | 0  | 10 
000001 | 1  | 11 

正如你所看到的,我們可以列舉所有的前綴後綴組合和分配每一個整數。

更重要的是,考慮到整數,我們可以推導出前綴後綴組合,它所對應:

key 57 = suffix 7, prefix 5 
key 99 = suffix 9, prefix 9 

如果我們以8位數字後綴的工作,沒有什麼變化。公式保留suffix = key % (MAX_PREFIX + 1)(其中%是模數或「餘數」運算符)和prefix = (key - suffix)/(MAX_PREFIX + 1)

我推薦做的只是使用正常的自動遞增主鍵,然後從它得到前綴/後綴,如上所示。如果您確實希望將這些派生列存儲在數據庫中,則可以使用填充這些列的ON INSERT觸發器來完成此操作。

如果您不允許使用主鍵,只需使用正常的序列號即可。重要的是你不必擔心「兩個價值」。這裏只有一個序列,無論你如何分解顯示。