我有一个客户表,我的要求是添加一个新的 varchar 列,该列在每次创建新客户时自动获取随机唯一值。

我想到编写一个随机化字符串的 SP,然后检查并重新生成该字符串是否已存在。但要将 SP 集成到客户记录创建过程中,需要代码级别的事务 SQL 内容,我想避免这种情况。

请帮助?

编辑:我应该强调一下,varchar必须是5个字符长,数值在1000到99999之间,如果数字小于10000,则在左侧填充0。

有帮助吗?

解决方案

如果它必须是VARCHAR,可以投唯一标识符为varchar。

要得到一个随机唯一标识符做 NEWID()

这里是你如何将它转换:

CAST(NewId() as varchar(36))

修改

按到@Brannon您的评论:

你说你永远不会有超过99K表中的记录?如果是这样,只是让你PK的标识列,与1000种子它,照顾“0”左填充在你的业务逻辑。

其他提示

这个问题使我有同样的感觉,当用户不会告诉我,他们想要做的,为什么还是什么,他们只是想告诉我怎么做,我得到的。

“随机”和“唯一”,除非你创建一个序列号列表,然后从它随机选择,删除所选择的值相互矛盾的要求。

但是,什么是这是为了解决什么问题?

通过您的编辑/更新,听起来像你需要的是一个自动递增和一些填充。

下面是一个使用假表的方法,然后增加一个IDENTITY列(假设你没有一个),它开始于1000后,将它使用一个计算列来给你一些填充,使一切工作了按照您的要求。

CREATE TABLE Customers (
    CustomerName varchar(20) NOT NULL
)
GO

INSERT INTO Customers 
SELECT 'Bob Thomas' UNION
SELECT 'Dave Winchel' UNION
SELECT 'Nancy Davolio' UNION
SELECT 'Saded Khan'
GO

ALTER TABLE Customers
    ADD CustomerId int IDENTITY(1000,1) NOT NULL
GO 

ALTER TABLE Customers
    ADD SuperId AS right(replicate('0',5)+ CAST(CustomerId as varchar(5)),5) 
GO

SELECT * FROM Customers
GO

DROP TABLE Customers
GO

我认为迈克尔对自动增量的回答应该很好 - 您的客户将得到“01000”,然后是“01001”,然后是“01002”,依此类推。

如果您想要或必须使其更加随机,在这种情况下,我建议您创建一个包含所有可能值(从“01000”到“99999”)的表。当您插入新客户时,请使用某种技术(例如随机化)从该表(仍然可用的客户 ID 池)中选择现有行之一,并使用它,并将其从表中删除。

随着时间的推移,其他任何事情都会变得非常糟糕。想象一下,您已经用完了 90% 或 95% 的可用客户 ID - 尝试随机查找剩余的少数可能性之一可能会导致几乎无休止的重试“这个是否已被占用?”是的 -> 尝试下一个”。

马克

是否随机串的数据必须是一定的格式?如果不是,为什么不使用唯一标识符?

insert into Customer ([Name], [UniqueValue]) values (@Name, NEWID())

或者使用NEWID()作为列的默认值。

修改 我同意@Rm,在数据库中使用的数值,并且处理转换为字符串(具有填充等)中的代码。

尝试这种情况:

ALTER TABLE Customer ADD AVarcharColumn varchar(50) 
CONSTRAINT DF_Customer_AVarcharColumn DEFAULT CONVERT(varchar(50), GETDATE(), 109)

它返回一个日期和时间到毫秒,至极将足以在大多数情况下。

你的真的需要一个独特的价值?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top