本篇文章给大家分享的是有关怎么在sql中利用Function创建一个长整形的唯一ID,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
一开始在C#等面向对像语言中编写一个获取PK的方法,那是很顺序就完成了。
接着是sql中,如果要用脚本导入数据,那就要提供一个sql的方法来获取PK。
最初设计PK的组成:时间(yyMMddHHmmssmsS) + '4位随机数' ,于是卡卡很快完成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
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多个重复的。
可见这个方法,做为获取单个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) 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行,没有一行重复!
以上就是怎么在sql中利用Function创建一个长整形的唯一ID,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程之家行业资讯频道。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。