我需要生成一个随机数(代替身份),所以我尝试了这些方法,但是在插入数据后,我在一段时间后遇到了主键违规。
尝试#1(旧查询):
SELECT CONVERT(NUMERIC (14,2), GETDATE()) * rand()
FROM sometable
尝试#2(修改后的查询):
SELECT CONVERT(NUMERIC(14,2), GETDATE()) * RAND(CAST(NEWID() AS VARBINARY))
FROM sometable
注意:
当我们要插入多个记录时,第一个查询总是会重复。
第二个查询在插入批量记录时会重复:每个事务5000条记录。
示例表结构:
CREATE table #test
(
id numeric(16,10) primary key
)
查询:
INSERT into #test (ID)
SELECT CONVERT(NUMERIC(14, 2), GETDATE()) * RAND(CAST(NEWID() AS VARBINARY))
FROM sys.objects
SELECT * FROM #test
要求:
我需要插入任意大量的行而不会发生任何主键冲突。
请告知 - 我也对其他任何其他想法持开放态度。
提前致谢..
如果我的问题不够明确,请纠正我。
答案 0 :(得分:1)
缩小问题。如果您生成的数字从1到10,那么获取副本需要多长时间?您遇到的问题没有什么不同,除了问题集更大。
如果您使用某些内容作为生成的主键,则应使用标识列或GUID。例如,如果您正在对产品进行编目,那就是SKU,PID或UPC等自然键。
这样的事情:
INSERT into #test (ID)
SELECT NEWID()