真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

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

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

藍(lán)田ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!

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

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

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

最初設(shè)計(jì)PK的組成:時(shí)間(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

然后來獲取一個(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
end
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ū)ο裰械腜K組成有機(jī)會(huì)在202x年之后存在沖突,因此增加一個(gè)標(biāo)識(shí) ‘1'+yy作為年以延長(zhǎng)千年蟲問題,雖然還是有機(jī)會(huì)發(fā)生沖突,但那也是幾百年以后的事情了。

但是為了保持效率和沖突的概率,還是將PK改為:'1'+時(shí)間(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

批量測(cè)試一下

select * from dbo.pks(500000)

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

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


網(wǎng)站欄目:怎么在SQL中利用Function創(chuàng)建一個(gè)長(zhǎng)整形的唯一ID
文章分享:http://weahome.cn/article/gjgseh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部