在數(shù)據(jù)庫(kù)中自動(dòng)生成編號(hào)的實(shí)現(xiàn)方法分享
更新時(shí)間:2011年10月31日 23:50:12 作者:
一直很討厭存儲(chǔ)過(guò)程,沒(méi)想到今天幫了我大忙啊,或許會(huì)因?yàn)榻裉熳屛衣矚g上存儲(chǔ)過(guò)程吧,不多說(shuō)了,切入正題
在使用數(shù)據(jù)庫(kù)的時(shí)候,難免要在使用過(guò)程中進(jìn)行刪除的操作,如果是使用int類型的字段,令其自增長(zhǎng),這是個(gè)最簡(jiǎn)單的辦法,但是后果會(huì)有些不是你想要的!看下這個(gè)Demo:
1.建立這樣的簡(jiǎn)單的表Test.

2.設(shè)置字段id的自增.

3.表添加數(shù)據(jù)
insert into Test(name) values('TestName')
insert into Test(name) values('TestName')
insert into Test(name) values('TestName')
4.你會(huì)看到

5.在這里我們刪除id為2的行.就只剩下了id為1和id為3的兩行數(shù)據(jù)了.(不上圖了)
6.再添加一條數(shù)據(jù).
insert into Test(name) values('TestName')
我們會(huì)發(fā)現(xiàn)這或許不是我們想要的結(jié)果了

為什么沒(méi)有id為2的呢? 之后任你死命的加,也不會(huì)有id為2的數(shù)據(jù)行了!
這樣的設(shè)計(jì)固然方便,但是魔鬼在于細(xì)節(jié),這篇博客就是為了解決這個(gè)問(wèn)題讓我們重新見(jiàn)到id為2的數(shù)據(jù)行(這里順便改進(jìn)一下,讓結(jié)果不只是顯示id為2這樣的int,假如有一天我們的各戶要求我們他們要一個(gè)5位數(shù)的id號(hào)嗎,從00000開(kāi)始,OK,這沒(méi)問(wèn)題)
1.主角登場(chǎng),存儲(chǔ)過(guò)程終于派上了用場(chǎng)了
Create procedure [dbo].[insertName]
(@name nvarchar(50))
as
begin
declare @i int
set @i=1
while(@i<10000)
begin
if exists(select convert(int,id) from numbertest where convert(int,id)=@i)
begin
set @i=@i+1
continue
end
else
begin
insert numbertest values(right('0000'+convert(varchar(5),@i),5),@name)--這里的兩個(gè)數(shù)字'5' 就是我們要設(shè)置的id長(zhǎng)度
break
end
end
end
2.用SQL 語(yǔ)句調(diào)用這個(gè)存儲(chǔ)過(guò)程
這樣的設(shè)計(jì)固然方便,但是魔鬼在于細(xì)節(jié),這篇博客就是為了解決這個(gè)問(wèn)題讓我們重新見(jiàn)到id為2的數(shù)據(jù)行(這里順便改進(jìn)一下,讓結(jié)果不只是顯示id為2這樣的int,假如有一天我們的各戶要求我們他們要一個(gè)5位數(shù)的id號(hào)嗎,從00000開(kāi)始,OK,這沒(méi)問(wèn)題)
1.主角登場(chǎng),存儲(chǔ)過(guò)程終于派上了用場(chǎng)了
復(fù)制代碼 代碼如下:
Create procedure [dbo].[insertName]
(@name nvarchar(50))
as
begin
declare @i int
set @i=1
while(@i<10000)
begin
if exists(select convert(int,id) from numbertest where convert(int,id)=@i)
begin
set @i=@i+1
continue
end
else
begin
insert numbertest values(right('0000'+convert(varchar(5),@i),5),@name)--這里的兩個(gè)數(shù)字'5' 就是我們要設(shè)置的id長(zhǎng)度
break
end
end
end
2.用SQL 語(yǔ)句調(diào)用這個(gè)存儲(chǔ)過(guò)程
execute insertName Test
你可以狂按幾次,幾十次,幾百次,我們要的數(shù)據(jù)加進(jìn)去了,

我們可以刪除指定的id數(shù)據(jù)行,當(dāng)我們?cè)俅芜M(jìn)行添加的時(shí)候,之前被刪掉的id行,將會(huì)被我們新添加的數(shù)據(jù)所覆蓋,這樣id就都可以連接起來(lái)了.
哦,對(duì)了,還沒(méi)有說(shuō)如何顯示的是 '0' 開(kāi)頭的呢?這個(gè)簡(jiǎn)單,將id的數(shù)據(jù)類型設(shè)置為nvarchar(5),就是這么簡(jiǎn)單!呵呵!
總結(jié):
這里我們調(diào)用了存儲(chǔ)過(guò)程,存儲(chǔ)過(guò)程不宜多用,但是有的時(shí)候還真是用起來(lái)很方便,本文章對(duì)于剛剛工作的童鞋們應(yīng)該還是有點(diǎn)幫助的吧,好好學(xué)習(xí)吧,生活很美好!
如釋重負(fù)的感覺(jué)啊,終于搞定一個(gè)問(wèn)題,在這里感謝幫助我的童鞋們! 下次再會(huì)!
總結(jié):
這里我們調(diào)用了存儲(chǔ)過(guò)程,存儲(chǔ)過(guò)程不宜多用,但是有的時(shí)候還真是用起來(lái)很方便,本文章對(duì)于剛剛工作的童鞋們應(yīng)該還是有點(diǎn)幫助的吧,好好學(xué)習(xí)吧,生活很美好!
如釋重負(fù)的感覺(jué)啊,終于搞定一個(gè)問(wèn)題,在這里感謝幫助我的童鞋們! 下次再會(huì)!
相關(guān)文章
SQL Server兩種分頁(yè)的存儲(chǔ)過(guò)程使用介紹
這篇文章主要介紹了SQL Server兩種分頁(yè)的存儲(chǔ)過(guò)程的使用,需要的朋友可以學(xué)習(xí)下2014-07-07
SQL語(yǔ)句實(shí)例說(shuō)明 方便學(xué)習(xí)mysql的朋友
我是在MySQL數(shù)據(jù)庫(kù)中做的測(cè)試,不同的數(shù)據(jù)庫(kù)有一定的差別方便學(xué)習(xí)mysql的朋友2012-09-09
用sql實(shí)現(xiàn)18位身份證校驗(yàn)代碼分享 身份證校驗(yàn)位計(jì)算
這篇文章主要介紹了用SQL寫(xiě)的18位身份證校驗(yàn)代碼,大家參考使用吧2014-01-01
必須會(huì)的SQL語(yǔ)句(四) 數(shù)據(jù)刪除和更新
這篇文章主要介紹了sqlserver中數(shù)據(jù)刪除和更新的sql語(yǔ)句,需要的朋友可以參考下2015-01-01
SQL Server 數(shù)據(jù)庫(kù)分離與附加 就這么簡(jiǎn)單!
這篇文章主要介紹了SQL Server 數(shù)據(jù)庫(kù)分離與附加,很簡(jiǎn)單的圖文教程,感興趣的小伙伴們可以參考一下2016-08-08
mssql2005,2008導(dǎo)出數(shù)據(jù)字典實(shí)現(xiàn)方法
在項(xiàng)目開(kāi)發(fā)過(guò)程中會(huì)用到數(shù)據(jù)字典,本文將詳細(xì)介紹mssql2005,2008如何導(dǎo)出數(shù)據(jù)字典,需要了解更多的朋友可以參考下2012-11-11

