怎么在SQL中利用Function创建一个长整形的唯一ID

66次阅读
没有评论

共计 1747 个字符,预计需要花费 5 分钟才能阅读完成。

自动写代码机器人,免费开通

本篇文章给大家分享的是有关怎么在 SQL 中利用 Function 创建一个长整形的唯一 ID,丸趣 TV 小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着丸趣 TV 小编一起来看看吧。

实现方法

一开始在 C# 等面向对像语言中编写一个获取 PK 的方法,那是很顺序就完成了。

接着是 SQL 中,如果要用脚本导入数据,那就要提供一个 SQL 的方法来获取 PK。

最初设计 PK 的组成:时间 (yyMMddHHmmssmsS) + 4 位随机数  ,于是卡卡很快完成 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

然后来获取一个 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
select pk,count(1) cnt
from @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)
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

批量测试一下

select * from dbo.pks(500000)

正常返回 500000 行,没有一行重复!

以上就是怎么在 SQL 中利用 Function 创建一个长整形的唯一 ID,丸趣 TV 小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注丸趣 TV 行业资讯频道。

向 AI 问一下细节

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-12-04发表,共计1747字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)