我有一个客户表,我的要求是添加一个新的varchar列,每次创建一个新客户时,该列自动获取一个随机唯一值。
我想过编写一个随机化字符串的SP,然后检查并重新生成字符串是否已经存在。但是要将SP集成到客户记录创建过程中,需要在代码级别进行事务性SQL,这是我想要避免的。
请帮忙吗?
编辑: 我应该强调,varchar必须是5个字符长,数字值介于1000和99999之间,如果数字小于10000,则填充左侧的0。
答案 0 :(得分:3)
如果必须是varchar,则可以将唯一标识符强制转换为varchar。
获取随机uniqueidentifier做NewId()
这是你如何施展它:
CAST(NewId() as varchar(36))
根据您对@Brannon的评论:
你是说你永远不会有超过99k的记录?如果是这样,只需将您的PK设为一个标识列,将其播种为1000,并在业务逻辑中处理“0”左侧填充。
答案 1 :(得分:1)
随机字符串数据是否需要是某种格式?如果没有,为什么不使用uniqueidentifier?
insert into Customer ([Name], [UniqueValue]) values (@Name, NEWID())
或使用NEWID()
作为列的默认值。
修改强> 我同意@rm,在数据库中使用数值,并在代码中处理转换为字符串(使用填充等)。
答案 2 :(得分:1)
这个问题给了我同样的感受,当用户不告诉我他们想要做什么,或者为什么,他们只想告诉我该怎么做时。
“随机”和“唯一”是相互冲突的要求,除非您创建一个序列列表,然后从中随机选择,删除所选值。
但这是打算解决的问题是什么?
答案 3 :(得分:1)
通过编辑/更新,您需要的声音就是自动增量和一些填充。
下面是一个使用伪表的方法,然后添加一个IDENTITY列(假设你没有)从1000开始,然后使用Computed Column为你提供一些填充以使一切都运行按照你的要求。
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
答案 4 :(得分:1)
我认为迈克尔对自动增量的回答应该运作良好 - 您的客户将获得“01000”,然后是“01001”,然后是“01002”,依此类推。
如果您想要或必须使其更随机,在这种情况下,我建议您创建一个包含所有可能值的表,从“01000”到“99999”。当您插入新客户时,使用一种技术(例如随机化)从该表中选择一个现有行(您的可用客户ID池),然后使用它,并将其从表中删除。
随着时间的推移,其他任何事情都会变得非常糟糕。想象一下,你已经消耗了90%或95%的可用客户ID - 试图随机找到剩下的几个可能性中的一个可能导致几乎无休止的重试“是这个被采取了吗?是的 - >尝试下一个” 。
马克
答案 5 :(得分:0)
试试这个:
ALTER TABLE Customer ADD AVarcharColumn varchar(50)
CONSTRAINT DF_Customer_AVarcharColumn DEFAULT CONVERT(varchar(50), GETDATE(), 109)
它返回的日期和时间最长为毫秒,在大多数情况下就足够了。
你真的需要一个独特的价值吗?