close

在資料庫建構資料表的過程中我們通常會設計一個主鍵(Primary)的欄位,此欄位內容不能重複並且能作為關連其他資料表的依據,例如我們常常會用身分證字號或是手機電話號碼,假設我想要設計一個不記名的問卷調查表,主鍵欄位可以設計為數值變數然後用流水號的方式不斷累加,也可以設計為字串變數然後自己設計編碼規則,

這次我要自己設計編碼規則以日期年月日加流水號,用當天的年月日當編碼的開頭這樣一來等明天過後就永遠不會重複了,例如每天建立的資料不超過10筆則編碼為yyyymmdd+x共9碼,如果每天建立的資料不超過100筆則編碼為10碼...以此類推,

用程式碼取得系統日期並不難但是要固定8碼就需要一點兒技巧了,例如2106/9/5與2016/12/10是不同的,所以目標是將2016/9/5十位數補"0"變成20160905,然後2016/12/10變成20161210這樣子就都會固定8碼了,程是碼如下:

接下來日期8碼後面的流水號若設計2碼,則亦需要在10以前將十位數補"0"變成01~09,這樣一來自己設計的字串主鍵欄位永遠都會是10碼了,
這是很重要的!
由於是用前端程式碼去累加流水號,所以當我們用SQL語法向後端資料庫索取目前主鍵欄位最大值的時候,如果是9碼就會產生重複的錯誤了!

以上述為例,若尾碼設計2碼但是在第1到第9筆資料沒有在主鍵尾碼的十位數補"0",當我們欲新增資料前依舊以SQL語法向後端資料表索取目前主鍵欄位最大值:

Select 訪談表編號 from DBTable order by 訪談表編號 desc

此時資料表會呈現這個狀態:

當我們第二次索取到201609299的時候,依規則累加尾碼後主鍵值變成2016092910,然後新增至資料表的時候就會發生"主鍵重複"的錯誤了!
所以如果有在第1到第9筆資料的主鍵尾碼補"0"當十位數,當我們用同樣SQL語法索取目前主鍵欄位最大值的時候,

這時資料表會呈現這個狀態:

我個人習慣將主鍵欄位用上述方法來設定,這樣一來事後也可利用它來查詢資料建立的時間,如果主鍵欄位是把日期及時間秒數都包進來,那幾乎可以不用再加上上述所說的尾碼了,除非該平台同時多人在使用新增的功能,因為發生重複錯誤的機率已經很低了...

 

所有筆記:程式開發隨手記

arrow
arrow

    王振權 發表在 痞客邦 留言(0) 人氣()