實(shí)現(xiàn)數(shù)據(jù)庫(kù)表中的流水號(hào)

實(shí)現(xiàn)的流水號(hào)樣式(字符+日期+流水號(hào))如下

流水號(hào).png

一般自己在寫小demo的時(shí)候,都是使用的純數(shù)字自增(1,2,3……)這種违施。相比而言互纯,流水號(hào)形式的看起來(lái)更正規(guī),而且可以從流水號(hào)中了解數(shù)據(jù)的添加時(shí)間及順序磕蒲,當(dāng)然留潦,是不是看著更有逼格。

目前我采用的方法是辣往,利用存儲(chǔ)過(guò)程來(lái)實(shí)現(xiàn)(可能還有很多方法)兔院,因?yàn)檫@種一般是在插入數(shù)據(jù)的時(shí)候使用,所以把插入數(shù)據(jù)的操作也放在了存儲(chǔ)過(guò)程站削。如果目前不知道存儲(chǔ)過(guò)程這個(gè)概念的小白坊萝,可以看我這篇的介紹第一次接觸存儲(chǔ)過(guò)程

<h3>分析</h3>
該字段由三部分組成:QQ字符 + 201706(年月,即當(dāng)前日期)+ 0001(流水號(hào)钻哩,自動(dòng)增長(zhǎng))

  1. QQ字符不用管
  2. 201706屹堰,當(dāng)然是先獲取到系統(tǒng)當(dāng)前的時(shí)間,然后拿到對(duì)應(yīng)的6位數(shù)值
  3. 流水號(hào)街氢,為了確保主鍵不重復(fù)扯键,同一時(shí)間內(nèi),這部分流水號(hào)應(yīng)該是不同的珊肃,所以流水號(hào)從 0000~9999 荣刑,即同一段時(shí)間最多會(huì)有一萬(wàn)個(gè)不同的流水號(hào)。(目前不考慮9999加1之后的情況)

<h3>實(shí)現(xiàn)</h3>
首先建立一個(gè)test表伦乔,方便講解

create table test(
     pk_id varchar(12) not null,
     name varchar(10) null
)

實(shí)現(xiàn)201706的前一步(拿到當(dāng)前的年月)

CONVERT(varchar(8), GETDATE(), 112)  --獲取對(duì)應(yīng)格式(20170601)的當(dāng)前系統(tǒng)時(shí)間

實(shí)現(xiàn)201706厉亏,同時(shí)把得到的值賦值給一個(gè)變量(為了代碼看起來(lái)清晰)

declare @dateStr varchar(6)  --定義變量
----使用substring()方法截取前6位,同時(shí)賦值變量
select @dateStr = (select SUBSTRING((Select CONVERT(varchar(8), GETDATE(), 112)),1,6)) 

實(shí)現(xiàn)0001的前一步(這里假設(shè)表中已經(jīng)存在一條數(shù)據(jù)烈和,那么它的4位流水號(hào)應(yīng)該是0000爱只,完整代碼部分中會(huì)考慮第一條數(shù)據(jù)的問題。拿到最近生產(chǎn)的4位流水號(hào)招刹,新的流水號(hào)是在此基礎(chǔ)上得到)

----拿到上一個(gè)最近生成的pk_id
select top 1 pk_id from table test order by pk_id desc 

實(shí)現(xiàn)0001恬试,這只是開始

declare @maxNo varchar(4)  ----定義變量
----把上訴得到的最近生產(chǎn)的pk_id窝趣,通過(guò)substring()方法截取最后的4位流水號(hào),然后對(duì)其加1
select @maxNo=(Select SUBSTRING( (select top 1 pk_id from test order by pk_id desc),9,4)+1);

雖然新生成了一個(gè)流水號(hào)训柴,但是不能直接使用哑舒,因?yàn)槿绻鸃maxNo的值不是4位數(shù),那么就會(huì)擾亂pk_id的隊(duì)形幻馁,所以需要進(jìn)行判斷

if (@maxNo < 10) begin
    set @maxNo = '000' + @maxNo; --如果是1位數(shù)的話洗鸵,需要在前面加3個(gè)0,補(bǔ)夠4位
end 
else if (@maxNo < 100) begin
    set @maxNo = '00' + @maxNo; --如果是2位數(shù)的話仗嗦,需要在前面加2個(gè)0膘滨,補(bǔ)夠4位
end
else if (@maxNo < 1000) begin
    set @maxNo = '0' + @maxNo; --如果是3位數(shù)的話,需要在前面加1個(gè)0儒将,補(bǔ)夠4位
end

至此吏祸,分割的各個(gè)部分都實(shí)現(xiàn)了。為了便于插入操作钩蚊,把所有值結(jié)合起來(lái)贡翘,用一個(gè)新的變量來(lái)存儲(chǔ)

declare @result nvarchar(12)--共計(jì)12位,前兩位為QQ砰逻,中間6位是年月鸣驱,最后4位是流水號(hào)
----把之前得到的@dateStr和maxNo加上,QQ字符直接加上即可
select @result=(Select 'QQ' + @dateStr + @maxNo);

最后蝠咆,把需要插入表中的數(shù)據(jù)作為參數(shù)傳遞到存儲(chǔ)過(guò)程中踊东,在存儲(chǔ)過(guò)程中執(zhí)行插入操作

@name -- 需要插入test表中的值
insert into test(pk_id,name) values(@result,@name)

這就是完整的過(guò)程,在執(zhí)行插入數(shù)據(jù)的操作時(shí)刚操,把除了pk_id之外的字段當(dāng)做參數(shù)傳入到存儲(chǔ)過(guò)程中闸翅,在存儲(chǔ)過(guò)程中執(zhí)行insert操作即可

完整的存儲(chǔ)過(guò)程代碼如下

USE [Test] ----Test是test表所在的數(shù)據(jù)庫(kù)名
GO
/****** Object:  StoredProcedure [dbo].[AddData]    Script Date: 06/01/2017 18:51:04 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[AddData]  
    @name varchar(10)  ----參數(shù),用于接收傳入的name值
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    
    declare @dateStr varchar(6),  ----定義變量,用于存儲(chǔ)6位數(shù)的時(shí)間
    @maxNo varchar(4), ----定義變量菊霜,用于存儲(chǔ)4位流水號(hào)
    @result varchar(12) -----定義變量坚冀,用于存儲(chǔ)新生成的pk_id
    
    ----獲取到系統(tǒng)當(dāng)前時(shí)間,并截取符合條件的6位鉴逞,同時(shí)賦值給@dateStr
    select @dateStr = (select SUBSTRING((Select CONVERT(varchar(8), GETDATE(), 112)),1,6))
    
    ----先判斷是否第一次向test表中插入數(shù)據(jù)(即當(dāng)前表中是否存在數(shù)據(jù))
    if exists (select * from test) begin
        ----獲取數(shù)據(jù)表中最近產(chǎn)生的一個(gè)pk_id记某,并截取最后4位流水號(hào),對(duì)4位流水號(hào)進(jìn)行加1构捡,最后賦值給@maxNo
        select @maxNo=(Select SUBSTRING( (select top 1 pk_id from test order by pk_id desc),9,4)+1);
        
        ----對(duì)上訴的@maxNo做判斷液南,確保流水號(hào)一定是4位,不夠的在前面補(bǔ)0
        if (@maxNo < 10) begin
            set @maxNo = '000' + @maxNo; --如果是1位數(shù)的話勾徽,需要在前面加3個(gè)0滑凉,補(bǔ)夠4位
        end 
        else if (@maxNo < 100) begin
            set @maxNo = '00' + @maxNo; --如果是2位數(shù)的話,需要在前面加2個(gè)0,補(bǔ)夠4位
        end
        else if (@maxNo < 1000) begin
            set @maxNo = '0' + @maxNo; --如果是3位數(shù)的話譬涡,需要在前面加1個(gè)0闪幽,補(bǔ)夠4位
        end
        
        ----將上訴結(jié)果合成一個(gè)新的pk_id
        select @result=(Select 'QQ' + @dateStr + @maxNo)
    end 
    else
       ----如實(shí)當(dāng)前插入的數(shù)據(jù)時(shí)第一條數(shù)據(jù)啥辨,那么直接把4位流水號(hào)設(shè)為0000
       select @result = 'QQ' + @dateStr + '0000'
        
    ----將數(shù)據(jù)插入到test表中
    insert into test(pk_id,name) values(@result,@name);
END
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末涡匀,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子溉知,更是在濱河造成了極大的恐慌陨瘩,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件级乍,死亡現(xiàn)場(chǎng)離奇詭異舌劳,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)玫荣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門甚淡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人捅厂,你說(shuō)我怎么就攤上這事贯卦。” “怎么了焙贷?”我有些...
    開封第一講書人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵撵割,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我辙芍,道長(zhǎng)啡彬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任故硅,我火速辦了婚禮庶灿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吃衅。我一直安慰自己往踢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開白布捐晶。 她就那樣靜靜地躺著菲语,像睡著了一般。 火紅的嫁衣襯著肌膚如雪惑灵。 梳的紋絲不亂的頭發(fā)上山上,一...
    開封第一講書人閱讀 51,198評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音英支,去河邊找鬼佩憾。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的妄帘。 我是一名探鬼主播楞黄,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼抡驼!你這毒婦竟也來(lái)了鬼廓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤致盟,失蹤者是張志新(化名)和其女友劉穎碎税,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體馏锡,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡雷蹂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了杯道。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片匪煌。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖党巾,靈堂內(nèi)的尸體忽然破棺而出萎庭,到底是詐尸還是另有隱情,我是刑警寧澤昧港,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布擎椰,位于F島的核電站,受9級(jí)特大地震影響创肥,放射性物質(zhì)發(fā)生泄漏达舒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一叹侄、第九天 我趴在偏房一處隱蔽的房頂上張望巩搏。 院中可真熱鬧,春花似錦趾代、人聲如沸贯底。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)禽捆。三九已至,卻和暖如春飘哨,著一層夾襖步出監(jiān)牢的瞬間胚想,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工芽隆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留浊服,地道東北人统屈。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像牙躺,于是被迫代替她去往敵國(guó)和親愁憔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容