首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成6位唯一数字

生成6位唯一数字
EN

Stack Overflow用户
提问于 2013-03-11 21:38:23
回答 8查看 43.5K关注 0票数 4

编辑:它将用作员工唯一编号(必须是随机排列的)

我有一张有列的桌子

代码语言:javascript
复制
id(auto-increment), uniqueNumber, and some other field

对于每一个插入的记录,我想为uniqueNumber生成一个6位的唯一数字,

现在我用扳机得到了这个

代码语言:javascript
复制
Create TRIGGER [dbo].[trgUniqueCode] ON [dbo].[testtable]
FOR INSERT
AS
declare @id int;
DECLARE @Upper INT
DECLARE @Lower INT
declare @result int
select @id=i.id from inserted i;
SET @Lower = 100000 
SET @Upper = (select top 1(isnull(UniqueNumber,999999)) from testtable) 
set @result =(ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0))
update testtable set UniqueNumber = @result where ID=@id

我不确定这种方法是否有效,我正在寻找一种生成(优先级时间执行)的最佳方法,或者我会在C#中生成唯一的数字?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2013-03-11 21:56:39

生成一个列表,列出所有尚未分配的号码。对列表进行洗牌,并创建一个包含随机ID和递增索引的新表。当需要新ID时,选择索引最少的ID;从未使用的ID表中删除该ID,并将其作为新ID返回。

票数 8
EN

Stack Overflow用户

发布于 2013-03-11 21:46:32

您可以使用以下方法从SQL Server中精确地获得6位长随机数:

代码语言:javascript
复制
SELECT CAST((RAND() * (899999) + 100000) as int) 

我使用以下代码更新表中具有随机生成的数字的字段:

第一部分是一个函数,只要将新行插入到表中,就会调用该函数。

代码语言:javascript
复制
CREATE VIEW ViewRndNum
AS
SELECT CAST((RAND() * (899999) + 100000) as int);


CREATE FUNCTION [dbo].[GetID](@Counter int = 0)
RETURNS int
AS
BEGIN
    DECLARE @RandNumber as int;
    DECLARE @iEmployeeCode as int;
    DECLARE @iExistingEmployeeCode as int;


    IF (@Counter < 20) 
        BEGIN
        SELECT @iEmployeeCode = RndNum
                    FROM ViewRndNum;


        SELECT @iExistingEmployeeCode = EmployeeCode FROM dbo.Employees WHERE EmployeeCode = @iEmployeeCode
        IF @iExistingEmployeeCode = @iEmployeeCode 
            BEGIN
                SET @Counter = @Counter + 1
                SELECT @iEmployeeCode = [dbo].[GetID](@Counter)
            END
        END
    ELSE
        SET @iEmployeeCode = 99999999
RETURN @iEmployeeCode
END
GO

CREATE TABLE [dbo].[Employees](
    [ID] [bigint] IDENTITY(1,1) NOT NULL,
    [EmployeeType] [int] NULL,
    [EmployeeID] [bigint] NULL,
    [EmployeeCode] [int] NULL,
    [Employee] [varchar](max) NULL,
    [CreatedDate] [datetime] NULL,
    [LastSeen] [datetime] NULL,
 CONSTRAINT [PK_Employees] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

ALTER TABLE [dbo].[Employees] ADD  CONSTRAINT [DF_Employees_EmployeeCode]  DEFAULT ([dbo].[getID]((0))) FOR [EmployeeCode]
GO
票数 3
EN

Stack Overflow用户

发布于 2013-03-11 21:43:09

Transact-SQL:

代码语言:javascript
复制
select floor(rand()*1000000-1)

C#:

代码语言:javascript
复制
Random rnd = new Random();
int rslt = rnd.Next(100000, 999999);

要生成唯一的值,最好的方法就是只增加一个。另外,生成唯一值的方法在计算效率上越来越低。

另外,您可能希望使用散列函数,它们提供“几乎”唯一的值。但这就是我不太熟悉的地方。

第三个选项是使用GUID作为唯一标识符。它们计算效率很高,即使跨越域边界也保证是唯一的。然而,它们大约有80个符号,而不仅仅是6 :)

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

https://stackoverflow.com/questions/15349170

复制
相关文章

相似问题

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