久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

怎么在SQL中利用Function創(chuàng)建一個(gè)長(zhǎng)整形的唯一ID

共計(jì) 1747 個(gè)字符,預(yù)計(jì)需要花費(fèi) 5 分鐘才能閱讀完成。

自動(dòng)寫代碼機(jī)器人,免費(fèi)開通

本篇文章給大家分享的是有關(guān)怎么在 SQL 中利用 Function 創(chuàng)建一個(gè)長(zhǎng)整形的唯一 ID,丸趣 TV 小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著丸趣 TV 小編一起來(lái)看看吧。

實(shí)現(xiàn)方法

一開始在 C# 等面向?qū)ο裾Z(yǔ)言中編寫一個(gè)獲取 PK 的方法,那是很順序就完成了。

接著是 SQL 中,如果要用腳本導(dǎo)入數(shù)據(jù),那就要提供一個(gè) SQL 的方法來(lái)獲取 PK。

最初設(shè)計(jì) PK 的組成:時(shí)間 (yyMMddHHmmssmsS) + 4 位隨機(jī)數(shù)  ,于是卡卡很快完成 dbo.pk()

Create function dbo.pk()
returns bigint
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)
go

然后來(lái)獲取一個(gè) 10000PK 測(cè)試:

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
select pk,count(1) cnt
from @tab
 group by pk
 having COUNT(1) 1

oh my god! 竟然有 30 多個(gè)重復(fù)的。

可見這個(gè)方法,做為獲取單個(gè) PK,那問題不大,但在做批量保存的時(shí)候,可能會(huì)發(fā)生主鍵沖突。

因此再設(shè)計(jì)一個(gè)支持批量保存的。

既然 4 位隨機(jī)數(shù)不能保證毫秒級(jí)的唯一,那就只能用有序數(shù)了,把 PK 的組成改為:時(shí)間 (yyMMddHHmmssmsS) + 4 位有序數(shù)

再考慮到年份只是 2 位數(shù),跟面向?qū)ο裰械?PK 組成有機(jī)會(huì)在 202x 年之后存在沖突,因此增加一個(gè)標(biāo)識(shí)‘1 +yy 作為年以延長(zhǎng)千年蟲問題,雖然還是有機(jī)會(huì)發(fā)生沖突,但那也是幾百年以后的事情了。

但是為了保持效率和沖突的概率,還是將 PK 改為:1 + 時(shí)間 (yyMMddHHmmssms) + 4 位有序數(shù) .

接下來(lái)又是一頓卡卡卡,dbo.pks(@count) 已出:

CREATE function dbo.pks(@count as int)
returns @pks table(pk bigint,id int)
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
go

批量測(cè)試一下

select * from dbo.pks(500000)

正常返回 500000 行,沒有一行重復(fù)!

以上就是怎么在 SQL 中利用 Function 創(chuàng)建一個(gè)長(zhǎng)整形的唯一 ID,丸趣 TV 小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注丸趣 TV 行業(yè)資訊頻道。

向 AI 問一下細(xì)節(jié)

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-12-04發(fā)表,共計(jì)1747字。
轉(zhuǎn)載說(shuō)明:除特殊說(shuō)明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請(qǐng)注明出處。
評(píng)論(沒有評(píng)論)
主站蜘蛛池模板: 南陵县| 大姚县| 宝清县| 乌拉特中旗| 苏尼特左旗| 临朐县| 松原市| 甘谷县| 元谋县| 如东县| 高雄县| 东莞市| 桐乡市| 贵德县| 信宜市| 乳源| 紫阳县| 阳曲县| 谷城县| 黄陵县| 灵丘县| 长子县| 通化县| 密山市| 安新县| 乌兰浩特市| 周宁县| 桐城市| 正镶白旗| 海林市| 铜山县| 沿河| 贵定县| 高州市| 大庆市| 安康市| 勃利县| 武定县| 青浦区| 化州市| 海兴县|