最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2018年07月11日 10:23:56   作者:Adamvv  
這篇文章主要給大家介紹了關(guān)于SQL利用Function創(chuàng)建長整形的唯一ID的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

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

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

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

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

最初設(shè)計(jì)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è)計(jì)一個支持批量保存的。

既然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ù)!

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

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

總結(jié)

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

相關(guān)文章

  • mssql注入躲避IDS的方法

    mssql注入躲避IDS的方法

    可能這個技巧早有人已經(jīng)會了,就是利用openrowset發(fā)送本地命令。通常我們的用法是(包括MSDN的列子)
    2008-06-06
  • 一步步教你使用Navicat工具創(chuàng)建MySQL數(shù)據(jù)庫連接

    一步步教你使用Navicat工具創(chuàng)建MySQL數(shù)據(jù)庫連接

    Navicat是一套快速、可靠并價格相當(dāng)便宜的數(shù)據(jù)庫管理工具,專為簡化數(shù)據(jù)庫的管理及降低系統(tǒng)管理成本而設(shè),下面這篇文章主要給大家介紹了關(guān)于如何使用Navicat工具創(chuàng)建MySQL數(shù)據(jù)庫連接的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • DBeaver連接hive的超詳細(xì)圖解

    DBeaver連接hive的超詳細(xì)圖解

    dbeaver是一個圖形化的界面工具,專門用于與各種數(shù)據(jù)庫的集成,通過dbeaver我們可以與各種數(shù)據(jù)庫進(jìn)行集成通過圖形化界面的方式來操作我們的數(shù)據(jù)庫與數(shù)據(jù)庫表,這篇文章主要給大家介紹了關(guān)于DBeaver連接hive的超詳細(xì)圖解,需要的朋友可以參考下
    2024-03-03
  • Navicat Premium15安裝及破解教程詳解親測有效(附破解失敗解決方案)

    Navicat Premium15安裝及破解教程詳解親測有效(附破解失敗解決方案)

    這篇文章主要介紹了Navicat Premium15安裝及破解教程詳解親測有效,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • 你真的知道怎么優(yōu)化SQL嗎

    你真的知道怎么優(yōu)化SQL嗎

    這篇文章主要給大家介紹了關(guān)于優(yōu)化SQL的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用SQL具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • SQL查詢出表、存儲過程、觸發(fā)器的創(chuàng)建時間和最后修改時間示例

    SQL查詢出表、存儲過程、觸發(fā)器的創(chuàng)建時間和最后修改時間示例

    這篇文章主要介紹了SQL查詢出表、存儲過程、觸發(fā)器的創(chuàng)建時間和最后修改時間示例,本文直接給出代碼實(shí)例,需要的朋友可以參考下
    2015-06-06
  • 數(shù)據(jù)庫同步優(yōu)化技巧分享

    數(shù)據(jù)庫同步優(yōu)化技巧分享

    這篇文章主要介紹了數(shù)據(jù)庫同步優(yōu)化技巧分享,需要的朋友可以參考下
    2015-10-10
  • Linux的HBASE數(shù)據(jù)庫集群部署方法

    Linux的HBASE數(shù)據(jù)庫集群部署方法

    HBase是一種針對海量數(shù)據(jù)的key-value型NoSQL數(shù)據(jù)庫,本文詳細(xì)介紹了在Linux系統(tǒng)下HBase的安裝與配置步驟,本文給大家介紹Linux的HBASE數(shù)據(jù)庫集群部署方法,感興趣的朋友一起看看吧
    2024-10-10
  • ssdb簡單介紹

    ssdb簡單介紹

    SSDB是一套基于LevelDB存儲引擎的非關(guān)系型數(shù)據(jù)庫(NOSQL),可用于取代Redis,更適合海量數(shù)據(jù)的存儲,這篇文章主要介紹了ssdb簡單介紹,需要的朋友可以參考下
    2023-08-08
  • 如何讓SQL運(yùn)行得更快

    如何讓SQL運(yùn)行得更快

    如何讓SQL運(yùn)行得更快...
    2007-01-01

最新評論

民权县| 嘉峪关市| 珲春市| 巴青县| 石阡县| 建宁县| 广河县| 嘉义市| 禄丰县| 蕉岭县| 公安县| 合川市| 西乌| 普格县| 济源市| 绵竹市| 淄博市| 鹤山市| 奇台县| 江油市| 宁津县| 修文县| 旺苍县| 厦门市| 双辽市| 漳平市| 东阿县| 新营市| 应用必备| 杭州市| 响水县| 祁阳县| 通城县| 钟祥市| 荥阳市| 汉沽区| 怀安县| 巍山| 揭阳市| 长泰县| 平塘县|