我使用此代码通过调用每个项目生成随机ID的函数来更新我的一个表。我从大约1000行开始,但现在大小正在增长,我发现表中有重复的ID。有没有办法可以修改我正在使用的代码,以便它查找已经在表中生成的ID,以便在有类似的代码时生成新代码。我也注意到了
答案 0 :(得分:0)
您的代码显示您设置了字段密码,但结果显示UniqueID是重复字段。 (也许它的密码已重命名?)
假设userId是唯一的:(如果不是,现在添加一个实际的标识列,“ALTER TABLE dbo.Users ADD ID INT NOT NULL IDENTITY(1,1)”应该这样做)并假设密码是要更改的字段,使用以下内容:
DECLARE @FN VARCHAR(20);
DECLARE @LN VARCHAR(20);
DECLARE @PW VARCHAR(20);
DECLARE @ID INT;
SELECT TOP 1
@FN = FirstName,
@LN = LastName,
@ID = userID
FROM dbo.Users
WHERE Password IS NULL;
WHILE @@ROWCOUNT = 1
BEGIN
SET @PW = dbo.GenerateID(FirstName, LastName);
WHILE EXIST (SELECT TOP 1 Password FROM dbo.Users WHERE Password = @PW)
SET @PW = dbo.GenerateID(FirstName, LastName);
UPDATE dbo.Users SET Password = @PW WHERE userId = @ID;
SELECT TOP 1
@FN = FirstName,
@LN = LastName,
@ID = userID
FROM dbo.Users
WHERE Password IS NULL;
END
这应该找一个空密码。如果没有找到,则跳过外部循环。如果找到一个,我们会生成密码,直到找到不在表中的密码。接下来,我们在外部循环结束之前查找另一行,密码为空。
答案 1 :(得分:0)
听起来像你的新手。别担心,TSQL很容易学习。首先,我建议您在UniqueID列上创建一个唯一的非聚集索引 - 这将防止重复值插入到您的表中。如果有人尝试在表中插入重复值,则会抛出异常。在您使用此功能之前,您需要从表中删除所有重复的“UniqueID”值。
CREATE UNIQUE NONCLUSTERED INDEX [IDX_UniqueID] ON [dbo].[Users] ( [UniqueID] ASC ) ON [PRIMARY]
您可以在此处详细了解非聚集索引:https://docs.microsoft.com/en-us/sql/relational-databases/indexes/clustered-and-nonclustered-indexes-described
我还建议您考虑将UniqueID字段的基础类型更改为“uniqueidentifier”。以下是使用UniqueID列的“uniqueidentifier”列类型的表架构示例:
CREATE TABLE [dbo].[Users]( [personId] [int] IDENTITY(1,1) NOT NULL, [firstName] [nvarchar](50) NOT NULL, [lastName] [nvarchar](50) NOT NULL, [UniqueID] [uniqueidentifier] NOT NULL, CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED ( [personId] ASC ) ON [PRIMARY] ) ON [PRIMARY]
SQL Serever中的'uniqueidentifier' column type包含全局唯一标识符(也称为GUID或UUID)。在大多数语言中生成GUID很容易。要在TSQL中生成GUID,您只需调用NEWID()函数即可。
SELECT NEWID() -- output: D100FC00-B482-4580-A161-199BE264C1D1
您可以在此处了解有关GUID的更多信息:https://en.wikipedia.org/wiki/Universally_unique_identifier
希望这会有所帮助。祝你的项目好运。 :)