SQL Server 2012:更新具有唯一编号的行

时间:2017-08-19 06:47:44

标签: sql sql-server database sql-server-2008

我有一张包含50k记录的表格。现在我想用随机数更新表的一列。这个数字应该是7位数。

我不想用程序或循环来做这件事。

PinDetailId  PinNo
--------------------
783          2722692
784          9888648
785          6215578
786          7917727

我已尝试过此代码,但无法成功。我需要7位数字。

SELECT 
    FLOOR(ABS(CHECKSUM(NEWID())) / 2147483647.0 * 3 + 1) rn, 
    (FLOOR(2000 + RAND() * (3000 - 2000) )) AS rn2 
FROM
    [GeneratePinDetail]

enter image description here

2 个答案:

答案 0 :(得分:2)

随机

对于随机数,您可以使用ABS(CHECKSUM(NewId())) % range + lowerbound
(来源:How do I generate random number for each row in a TSQL Select?

INSERT INTO ResultsTable (PinDetailId, PinNo)
SELECT PinDetailId, 
       (ABS(CHECKSUM(NewId())) % 1000000 + 1000000) AS `PinNo`
FROM GeneratePinDetail
ORDER BY PinDetailId ASC;

可能不唯一

我无法保证这些将是独一无二的;但它应该均匀分布(任何7位数字的机会均等)。如果要检查重复项,可以运行:

SELECT PinDetailId, PinNo 
FROM ResultsTable result
INNER JOIN (
    SELECT PinNo
    FROM ResultsTable
    GROUP BY PinNo
    HAVING Count(1) > 1
) test
ON result.PinNo = test.PinNo;

答案 1 :(得分:0)

您可以创建序列对象并更新字段 - 它应该每次更新自动递增。

https://docs.microsoft.com/en-us/sql/t-sql/functions/next-value-for-transact-sql

根据评论更新: 检索序列中的“下一个值”后,您可以对其进行操作以进行随机化。然后基本上可以使用该序列为随机化函数创建唯一的种子。

如果您不想自己创建函数,SQL Server已经内置了RAND函数。

https://docs.microsoft.com/en-us/sql/t-sql/functions/rand-transact-sql