2014-12-02 57 views
0

我有一个要求生成一个随机数(代替身份),所以我尝试了这些方法,但插入数据后,我遇到了一段时间的主键违规。数字(16,10)数据类型的随机数

尝试#1(旧的查询):

SELECT CONVERT(NUMERIC (14,2), GETDATE()) * rand() 
FROM sometable 

尝试#2(修改的查询):

SELECT CONVERT(NUMERIC(14,2), GETDATE()) * RAND(CAST(NEWID() AS VARBINARY)) 
FROM sometable 

注:

第一个查询总是得到当我们有多个记录插入时重复。

第二个查询在插入批量记录前重复:ex:每个事务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 

要求:

我需要插入任何大量的行没有任何主键冲突。

请注意 - 我也欢迎任何其他备用想法。

在此先感谢..

请纠正我,如果我的问题不够清楚。

+1

你将永远无法保证任何随机生成的号码已经不存在在表格中。你将不得不提前检查,或处理PK违规。 – 2014-12-02 18:09:02

+0

嗨比尔..是否有任何替代方案你能建议.. – user3094037 2014-12-02 18:13:26

+0

为什么要求排除使用'IDENTITY'?这是为了这个任务。 – 2014-12-02 18:30:01

回答

1

缩小问题。如果您从1到10生成一个数字,需要多长时间才能获得重复数据?您遇到的问题没有什么不同,除非遇到更大的问题。

如果您将某些东西用作生成的主键,则应使用标识列或GUID。例如,如果您正在对产品进行编目,那么它就是SKU或PID或UPC等自然键。

事情是这样的:

INSERT into #test (ID) 
    SELECT NEWID()