您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關(guān)怎么在SQL中利用Function創(chuàng)建一個長整形的唯一ID,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
實現(xiàn)方法
一開始在C#等面向?qū)ο裾Z言中編寫一個獲取PK的方法,那是很順序就完成了。
接著是SQL中,如果要用腳本導(dǎo)入數(shù)據(jù),那就要提供一個SQL的方法來獲取PK。
最初設(shè)計PK的組成:時間(yyMMddHHmmssmsS) + '4位隨機(jī)數(shù)' ,于是卡卡很快完成dbo.pk()
Create function dbo.pk() returns bigint as begin declare @pk as bigint,@fix bigint,@idx int,@ts as datetime set @ts = GETDATE() set @pk = convert(bigint,convert(varchar(6),@ts,12) + replace(convert(varchar(12),@ts,114),':',''))*10000 select @idx = A*10000 from vRand return (@pk + @idx) end go
然后來獲取一個10000PK測試:
declare @tab as table(pk bigint) declare @i as integer set @i =0 while(@i<10000) begin insert @tab select dbo.pk() set @i = @i+1 end select pk,count(1) cnt from @tab group by pk having COUNT(1)>1
oh my god!竟然有30多個重復(fù)的。
可見這個方法,做為獲取單個PK,那問題不大,但在做批量保存的時候,可能會發(fā)生主鍵沖突。
因此再設(shè)計一個支持批量保存的。
既然4位隨機(jī)數(shù)不能保證毫秒級的唯一,那就只能用有序數(shù)了,把PK的組成改為:時間(yyMMddHHmmssmsS) + '4位有序數(shù)'
再考慮到年份只是2位數(shù),跟面向?qū)ο裰械腜K組成有機(jī)會在202x年之后存在沖突,因此增加一個標(biāo)識 ‘1'+yy作為年以延長千年蟲問題,雖然還是有機(jī)會發(fā)生沖突,但那也是幾百年以后的事情了。
但是為了保持效率和沖突的概率,還是將PK改為:'1'+時間(yyMMddHHmmssms) + '4位有序數(shù)'.
接下來又是一頓卡卡卡,dbo.pks(@count)已出:
CREATE function dbo.pks(@count as int) returns @pks table(pk bigint,id int) as begin declare @pk as bigint,@fix bigint,@idx int,@ts as datetime,@lop int,@i int set @ts = GETDATE() set @pk = convert(bigint,'1'+convert(varchar(6),@ts,12) + replace(convert(varchar(11),@ts,114),':',''))*10000 set @idx =0 set @lop = CEILING(@count/10000.0) set @i = 1 while(@lop >0) begin set @pk = @pk + 10000 set @idx = 0 while(@idx<10000 and @idx<@count) begin insert @pks(pk,id) values(@pk+@idx,@idx+ @i) set @idx = @idx +1 end set @lop = @lop -1 set @i = @i+10000 end return end go
批量測試一下
select * from dbo.pks(500000)
正常返回500000行,沒有一行重復(fù)!
以上就是怎么在SQL中利用Function創(chuàng)建一個長整形的唯一ID,小編相信有部分知識點(diǎn)可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。