台灣最大程式設計社群網站
線上人數
1031
 
會員總數:245214
討論主題:189087
歡迎您免費加入會員
討論區列表 >> 專欄文章 >> 序號產生器的設計概念 ─〔前言〕
[]  
[我要回覆]
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
序號產生器的設計概念 ─〔前言〕
價值 : 0 QP  點閱數:1337 回應數:0

樓主

ASP.NET新手
中級專家
5761 72
5428 2176
發送站內信

捐贈 VP 給 ASP.NET新手
我是一個程式設計的新手,想寫一個當新增一筆資料時能自動編號存進資料庫裡的程式,
而且編號需以當日新增的日期+上流水號來新增進SQL裡,
(如:06(年) 07(月) 25(日) 001(流水號) = 060725001)10碼,
而若遇上8月1日時可以自動更為(060801001),07年1月1日也是(070101001)

在有關程式設計的各大討論區,我想這個問題是很常見的
每隔一段時間,就會有許多人問相同的問題
由於序號的應用方式變化萬千,並沒有一套共同的標準
在此僅提供設計序號產生器上的一些思維供各位作參考

在介紹序號產生器的設計方式之前,先談談大家在面對這樣的需求時
會遇到什麼樣的難題?

以Microsoft SQL SERVER 2000為例,大家在產生序號欄位時
最常見的方式就是建立一個欄位型態為INT的欄位
然後再將識別值種子及識別值增量各別設定為1,讓這個資料表每產生一筆記錄時
使這個欄位的序號自動加1

但這樣子的序號,並不具任何意義
因此,大家需要的序號,最常見的就如本篇文章一開始提到的問題

序號必須是依日期再加上流水號

那麼問題就來了,有些人可能會想到利用Select count(*) From 資料表 Where 日期欄位 = 今天的日期
類似這樣的SQL敘述,來計算同一天日期內的資料有幾筆
那麼新建立的資料序號,就可以利用這個數字+1即可

但這個方式有個致命傷,如果同一天的日期內的資料,有其中一筆被刪除的話
那可能就會發生序號重覆的問題了

因此,有些人就會換個方式直接取出同一天日期內,最大的那個序號再加上1的方式來做
但這樣子的方式好嗎?
答案是否定的,因為這樣的方式也有個致命傷
當同一天內的資料中,最後一筆建立的資料被刪除了,假設它的序號是200703160005
那麼目前最大的序號就是200703160004了
這時如果再建立新的一筆記錄,那麼序號同樣會是200703160005

聰明的讀者們是否想到了致命傷在哪裡呢?
沒錯,當如果發生誤刪記錄時,此時又已建立了相同序號的新記錄
這樣子就會發生序號重複的問題,這種狀況也是不被允許的

所以,小弟認為一個良好的序號設計規則是必須的
在下一篇文章中,將開始進入主題
與大家一同探討一個良好的序號產生規則該如何去設定?

搜尋相關Tags的文章: [ 序號 ] , [ 單號 ] , [ 序號產生器 ] , [ 編號 ] ,
本篇文章發表於2007-03-21 16:47
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
目前尚無任何回覆
   

回覆
如要回應,請先登入.