假设我创建了一个Product Table,其中Product_No是主键。现在,当在每一行中插入一个新产品时,主键列应该生成任何随机的8位数字值,如下所示:
48917232
19718291
12672554
12480288
21835819可能无法使用IDENTITY或UNIQUEIDENTIFIER来实现。
SQL Server是否有任何数据类型可以在每次插入新产品时随机自动生成8位数字?
发布于 2018-09-05 03:22:23
首先,这是一个奇怪的请求。你可能想要重新审视你的设计。
这个答案可能会有所帮助,即使它不完全符合您的规范。
第一个:NewId()。
NewId生成一个‘`UniqueIdentifier’类型的“看似”随机值。以下是一些示例输出:
5371C9B2-CC80-4B42-98F2-FF8D87F84358
46A08052-9A06-43C3-AE1C-8E9165328A38
这超过8个字符的长度,并且是字母数字,所以我不太适合您的请求。
请注意,将这种类型的值设置为聚集索引通常不是一个好主意。
第二:序列
序列是Sql Server中用于生成数字的对象。它们可以限制为8位数(具有停止和开始值),并且可以跳过值(例如,它可以按8或3或其他值计数)。
这不是随机的。(计算中的任何数字都是随机的吗?)但它确实允许生成符合您想要的数字范围的数字。
摘要
无论如何,这就是我对它的输入。我推荐使用序列。但实际上,我建议您更仔细地查看您的设计,因为它需要随机数作为标识符。对随机性的需求通常是一种设计味道(随机性通常用于虚假的安全性,并且不利于在Sql Server中存储索引)。
发布于 2018-09-05 02:42:52
您可以像这样制作自己的函数:
CREATE FUNCTION MYRAND(@RANDOMNUMBER NUMERIC(18,10))
RETURNS INT
AS
BEGIN
DECLARE @MYRAND INT
SET @MYRAND = (SELECT FLOOR(@RANDOMNUMBER*(9999999-1000000+1)+1000000))
RETURN @MYRAND
END然后,作为该列的默认值,执行以下操作:
([dbo].[MYRAND](RAND()))

您不能将RAND作为函数的一部分,这就是为什么需要将一个RAND值传递给函数,然后它被用来使用FLOOR函数生成一个恰好8位的随机数。
现在,如果你需要一个唯一的随机数,你必须做一些其他的事情,因为不能保证这些随机数是唯一的。也许可以使用插入的instead of trigger来生成数字,并检查以确保该数字不存在。
您还可以使用逻辑预填充表中可能需要的所有数字,并从预填充表中删除它们并使用它们。
或者,您可以让insert触发器找到您已经插入的MAX值,然后只加1。
您还可以将id列设置为identity,并将其设定为10000000。它不是随机的,但可能会做你想做的事情。
https://stackoverflow.com/questions/52171681
复制相似问题