麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 數據庫 > 文庫 > 正文

SQL利用Function創建長整形的唯一ID示例代碼

2020-10-29 21:46:39
字體:
來源:轉載
供稿:網友

前言

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

實現方法

一開始在C#等面向對像語言中編寫一個獲取PK的方法,那是很順序就完成了。

接著是SQL中,如果要用腳本導入數據,那就要提供一個SQL的方法來獲取PK。

最初設計PK的組成:時間(yyMMddHHmmssmsS) + '4位隨機數'   ,于是卡卡很快完成dbo.pk()

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

然后來獲取一個10000PK測試:

declare @tab as table(pk bigint)declare @i as integerset @i =0while(@i<10000)begininsert @tabselect dbo.pk() set @i = @i+1endselect pk,count(1) cntfrom @tab group by pk having COUNT(1)>1

oh my god!竟然有30多個重復的。

可見這個方法,做為獲取單個PK,那問題不大,但在做批量保存的時候,可能會發生主鍵沖突。

因此再設計一個支持批量保存的。

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

再考慮到年份只是2位數,跟面向對像中的PK組成有機會在202x年之后存在沖突,因此增加一個標識 ‘1'+yy作為年以延長千年蟲問題,雖然還是有機會發生沖突,但那也是幾百年以后的事情了。

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

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

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

批量測試一下

select * from dbo.pks(500000)

正常返回500000行,沒有一行重復!

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

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

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 爱唯侦察 国产合集 亚洲 | 草莓福利视频在线观看 | 久草高清视频 | 91短视频在线播放 | 欧美一级淫片免费视频1 | 999久久国精品免费观看网站 | 羞羞视频免费网站男男 | 国产一区免费在线 | 综合毛片 | 免费黄色成人 | 91精品国产综合久久婷婷香蕉 | 一级黄色免费观看 | www国产成人免费观看视频,深夜成人网 | 一级免费在线视频 | 亚洲91精品| 日本欧美一区二区三区在线观看 | 羞羞视频免费视频欧美 | 在线日韩av电影 | 成人精品一区二区 | 黄色网络免费看 | 韩国草草影院 | 亚洲一区二区 | 大西瓜永久免费av在线 | 亚洲第一色片 | www.国产.com| 欧美成年私人网站 | 免费香蕉成视频成人网 | 泰剧19禁啪啪无遮挡 | 国产毛片自拍 | 久久久一区二区三区精品 | 色欧美视频| 午夜视频免费在线观看 | 欧美日韩一区,二区,三区,久久精品 | 亚洲视频在线一区二区 | 久久成年网站 | 色阁阁69婷婷 | 91超视频| 免费观看三级毛片 | 日本大片在线播放 | 特级毛片全部免费播放器 | 久久精精品 |