Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-唯一列5个随机数字_Sql_Sql Server - Fatal编程技术网

SQL-唯一列5个随机数字

SQL-唯一列5个随机数字,sql,sql-server,Sql,Sql Server,我是SQL的新手,我希望有一个能生成5个唯一数字的列。很像一个id列,只是我希望得到5个随机顺序的数字,并且该列是唯一的 例如: 56829 73591 17469 46290 我有一个id列,是自动递增和唯一的,但现在我需要另一个列,是唯一的,将生成5位数字,我有点研究这一点,显然有一个uniqueidentifier列类型,我有它的文档,但我不确定这是否是我要找的…请帮助 也许一个伪随机数就足够了。你可以这样做: alter table t add id5 as ( (id * 1

我是SQL的新手,我希望有一个能生成5个唯一数字的列。很像一个id列,只是我希望得到5个随机顺序的数字,并且该列是唯一的

例如:

56829
73591
17469
46290

我有一个id列,是自动递增和唯一的,但现在我需要另一个列,是唯一的,将生成5位数字,我有点研究这一点,显然有一个uniqueidentifier列类型,我有它的文档,但我不确定这是否是我要找的…请帮助

也许一个伪随机数就足够了。你可以这样做:

alter table t
    add id5 as ( (id * 19379 + 62327) % 99991)
这些数字只是小于100000的任意素数。因为它们是素数,所以对于介于1和99991之间的值,数字不应重复

编辑:

对于素数来说,这是很容易证明的。假设id1和id2具有相同的值:

(id1 * 19379 + 62327) % 99991) = n
(id2 * 19379 + 62327) % 99991) = n
然后减去它们:

(id1 - id2) * 19379 % 99991 = 0
诚然,在这一点上你需要一点数论。但是,可以说两个素数(19379和99991)没有共同的除数。因此,当
id1-id2
是99991的倍数时,这是唯一正确的方法

(从技术上讲,你可以做的是除以19379,因为它的逆是定义良好的。在模运算中,逆并不总是定义良好的,但当它们被除法时是允许的。)

后一种情况是一种花哨的说法,表示数字不会重复

编辑:


如果您想要5位数字,那么您可以使用
%89989
并将10000添加到结果中。

也许一个伪随机数就足够了。你可以这样做:

alter table t
    add id5 as ( (id * 19379 + 62327) % 99991)
这些数字只是小于100000的任意素数。因为它们是素数,所以对于介于1和99991之间的值,数字不应重复

编辑:

对于素数来说,这是很容易证明的。假设id1和id2具有相同的值:

(id1 * 19379 + 62327) % 99991) = n
(id2 * 19379 + 62327) % 99991) = n
然后减去它们:

(id1 - id2) * 19379 % 99991 = 0
诚然,在这一点上你需要一点数论。但是,可以说两个素数(19379和99991)没有共同的除数。因此,当
id1-id2
是99991的倍数时,这是唯一正确的方法

(从技术上讲,你可以做的是除以19379,因为它的逆是定义良好的。在模运算中,逆并不总是定义良好的,但当它们被除法时是允许的。)

后一种情况是一种花哨的说法,表示数字不会重复

编辑:


如果您需要5位数字,则可以使用
%89989
并在结果中添加10000。

我从未以这种方式使用过UNIQUEIDENTIFIER,因此可能会得到更正。这样,您应该能够创建一个唯一的GUID,作为自动生成行的唯一Id

CREATE TABLE MyTable (
    Id INT NOT NULL IDENTITY(1,1) PRIMARY KEY
    ,UniqueId UNIQUEIDENTIFIER DEFAULT NEWSEQUENTIALID()
    ,...Other columns
);   

我从未以这种方式真正使用过UNIQUEIDENTIFIER,所以我可能会得到更正。这样,您应该能够创建一个唯一的GUID,作为自动生成行的唯一Id

CREATE TABLE MyTable (
    Id INT NOT NULL IDENTITY(1,1) PRIMARY KEY
    ,UniqueId UNIQUEIDENTIFIER DEFAULT NEWSEQUENTIALID()
    ,...Other columns
);   


你们有几排?5位数字只需要10万行。行数不会超过6000行。基本上,我希望在插入时生成此行,就像自动增量唯一id列一样。您是否反对使用GUID作为唯一标识符?据我所知,它是32个字符和随机的。这不是一件好事。您将被迫使用循环以确保尚未使用任何新号码。如果有什么问题,您应该创建一个“随机”数字表,然后只使用第一个尚未使用的数字。这类事情几乎总是充满问题,因为有人太看重一个无意义的数字。你有多少行?5位数字只需要10万行。行数不会超过6000行。基本上,我希望在插入时生成此行,就像自动增量唯一id列一样。您是否反对使用GUID作为唯一标识符?据我所知,它是32个字符和随机的。这不是一件好事。您将被迫使用循环以确保尚未使用任何新号码。如果有什么问题,您应该创建一个“随机”数字表,然后只使用第一个尚未使用的数字。这类事情几乎总是充满了问题,因为有人对一个无意义的数字太看重了。创意——你过去有没有需要过这样的东西?非常有趣!我觉得我不够数学,所以出于好奇,我可能会运行一个模拟,并看到副本…是的,可能的Id为0-99991没有一个副本。对于最初发布的要求,这是一个非常巧妙的解决方案。有时我对我的能力感觉非常好。。。然后我看到像这样的东西。。。现实糟透了。富有创造性——你过去需要过这样的东西吗?非常有趣!我觉得我不够数学,所以出于好奇,我可能会运行一个模拟,并看到副本…是的,可能的Id为0-99991没有一个副本。对于最初发布的要求,这是一个非常巧妙的解决方案。有时我对我的能力感觉非常好。。。然后我看到像这样的东西。。。现实很糟糕。我创建了一个表来进行测试,就像这样
CREATE table TestingTable(Id INT NOT NULL IDENTITY(1,1)主键,UniqueId UNIQUEIDENTIFIER DEFAULT NEWSEQUENTIALID(),Name Varchar(MAX))
并试图插入此测试表
插入测试表值('James')
,但收到此错误,列名称或提供的值数与表定义不匹配。newsequentialid相当无用。它们是可预测的,至少不是随机的。这不完全是5位数字。但这不是你的帖子所说的,@user979331。。。。Unique Column 5 random digitsI之所以发布此消息,是因为用户评论说GUID可以,因为这是此类情况的常见解决方案@戈登林诺夫对给定的问题有确切的答案