首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在SQL Server中随机自动生成主键列的8位数字值?

如何在SQL Server中随机自动生成主键列的8位数字值?
EN

Stack Overflow用户
提问于 2018-09-05 01:55:58
回答 2查看 1.6K关注 0票数 0

假设我创建了一个Product Table,其中Product_No是主键。现在,当在每一行中插入一个新产品时,主键列应该生成任何随机的8位数字值,如下所示:

代码语言:javascript
复制
48917232
19718291
12672554
12480288
21835819

可能无法使用IDENTITY或UNIQUEIDENTIFIER来实现。

SQL Server是否有任何数据类型可以在每次插入新产品时随机自动生成8位数字?

EN

回答 2

Stack Overflow用户

发布于 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中存储索引)。

票数 1
EN

Stack Overflow用户

发布于 2018-09-05 02:42:52

您可以像这样制作自己的函数:

代码语言:javascript
复制
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

然后,作为该列的默认值,执行以下操作:

代码语言:javascript
复制
([dbo].[MYRAND](RAND()))

您不能将RAND作为函数的一部分,这就是为什么需要将一个RAND值传递给函数,然后它被用来使用FLOOR函数生成一个恰好8位的随机数。

现在,如果你需要一个唯一的随机数,你必须做一些其他的事情,因为不能保证这些随机数是唯一的。也许可以使用插入的instead of trigger来生成数字,并检查以确保该数字不存在。

您还可以使用逻辑预填充表中可能需要的所有数字,并从预填充表中删除它们并使用它们。

或者,您可以让insert触发器找到您已经插入的MAX值,然后只加1。

您还可以将id列设置为identity,并将其设定为10000000。它不是随机的,但可能会做你想做的事情。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52171681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档