共计 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 问一下细节