濮阳杆衣贸易有限公司

主頁 > 知識庫 > SQL利用Function創(chuàng)建長整形的唯一ID示例代碼

SQL利用Function創(chuàng)建長整形的唯一ID示例代碼

熱門標(biāo)簽:怎么去開發(fā)一個電銷機器人 簡單的智能語音電銷機器人 ai電話電話機器人 小程序智能電話機器人 泗洪正規(guī)電話機器人找哪家 湖南保險智能外呼系統(tǒng)產(chǎn)品介紹 南昌呼叫中心外呼系統(tǒng)哪家好 怎么申請400熱線電話 河北便宜電銷機器人軟件

前言

在設(shè)計表的時候考慮主鍵的數(shù)據(jù)類型是長整形還是字符串,最簡單的方式當(dāng)然是newid(),但這也有個問題,就是主鍵長度過長(36個字),數(shù)據(jù)量一多,必然會影響數(shù)據(jù)庫操作的效率,而且大大增加了數(shù)據(jù)文件和索引文件所占用的空間。而且,newid返回的字符串是隨機的,查詢結(jié)果不能保證按保存順序返回。這對于有順序要求的系統(tǒng)來說,需要額外增加順序列來進(jìn)行排序,這也導(dǎo)致查詢語句更加復(fù)雜。這也是主要放棄newid作為主鍵的主要原因。因此考慮用長整形來作數(shù)據(jù)表主鍵的數(shù)據(jù)類型。

實現(xiàn)方法

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

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

最初設(shè)計PK的組成:時間(yyMMddHHmmssmsS) + '4位隨機數(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(@i10000)
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位隨機數(shù)不能保證毫秒級的唯一,那就只能用有序數(shù)了,把PK的組成改為:時間(yyMMddHHmmssmsS) + '4位有序數(shù)'

再考慮到年份只是2位數(shù),跟面向?qū)ο裰械腜K組成有機會在202x年之后存在沖突,因此增加一個標(biāo)識 ‘1'+yy作為年以延長千年蟲問題,雖然還是有機會發(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(@idx10000 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ù)!

在返回的結(jié)果列中,ID是從1開始編號的,這也保持與SQL的Row_number保持一致,方便SQL編程引用。

OK,到這里用利用SQL function獲取PK就搞定了!

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • Sql function 多行中的列合并為一行一列的方法
  • SQl Function 創(chuàng)建函數(shù)實例介紹
  • SQL Function 自定義函數(shù)詳解

標(biāo)簽:瀘州 柳州 景德鎮(zhèn) 威海 淮安 荊門 那曲 江蘇

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《SQL利用Function創(chuàng)建長整形的唯一ID示例代碼》,本文關(guān)鍵詞  SQL,利用,Function,創(chuàng)建,長整,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《SQL利用Function創(chuàng)建長整形的唯一ID示例代碼》相關(guān)的同類信息!
  • 本頁收集關(guān)于SQL利用Function創(chuàng)建長整形的唯一ID示例代碼的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    岳阳市| 平乐县| 南岸区| 伽师县| 宕昌县| 黄平县| 株洲市| 苍南县| 惠安县| 壶关县| 封丘县| 额济纳旗| 普兰县| 苏尼特右旗| 义乌市| 剑阁县| 巴青县| 玉田县| 威海市| 六盘水市| 中西区| 杭锦旗| 宜昌市| 老河口市| 宜宾县| 永州市| 霞浦县| 资溪县| 南昌市| 拜泉县| 盐津县| 阆中市| 调兵山市| 石景山区| 眉山市| 廊坊市| 汉源县| 鄂伦春自治旗| 峨边| 石景山区| 和林格尔县|