Вопрос
О, великий Stackoverflow, я умоляю тебя ... Мне нужно сделать следующее:
СОЗДАТЬ УНИКАЛЬНЫЙ ИНДЕКС UserName ON Emp (UserName) - Sheesh!
UPDATE Emp SET
UserName = Left(FirstName,1)+LastName
ГДЕ НЕ существует сотрудник с таким именем пользователя.
Решение
Это все еще позволит дублировать ... но если вы хотите, что вы сказали, Попробуйте это (именно то, что вы сказали):
UPDATE Emp SET
UserName = Left(FirstName,1) + LastName
Where Not Exists (Select * From Emp
Where UserName = Left(FirstName,1) + LastName)
Однако я бы предположил, что вы пытаетесь избежать дубликатов, а не просто сбрасывать имена пользователей, если ни одно из существующих не совпадает с предлагаемым новым значением. Если это так, вы должны добавить уникальный индекс в столбец userName, но сначала запустите:
UPDATE Emp SET
UserName = Left(FirstName,1) + LastName
Where Not Exists
(Select * From Emp
Where UserName = Left(FirstName,1) + LastName)
And Not Exists
(Select * From Emp
Group By Left(FirstName,1) + LastName
Having Count(*) > 1)
Это сбросит все имена пользователей, которые МОГУТ быть сброшены без создания дубликатов. (Это не устранит существующие Dupes). Если после этого нет дубликатов, вы можете применить индекс.
Другие советы
Я бы добавил уникальный индекс для имени пользователя и использовал бы:
UPDATE IGNORE Emp SET UserName = Left(FirstName,1)+LastName
Если ваша база данных это поддерживает;)
Да, если вы не читаете дальше, имя пользователя действительно должно быть уникальным, также я бы позаботился о том, чтобы в предложении where было что-то еще, потому что это будет интенсивный запрос.
Вы можете написать для этого функцию, которая добавит в конец какую-то другую уникальность или идентификатор (если он существует (Count (*), где userName, например, Username).
UPDATE Emp SET
UserName = Left(FirstName,1)+LastName
WHERE
UserName not in (Select UserName From Emp Where UserName = Left(FirstName,1) + LastName)
Во-первых, ваше поле имени пользователя должно иметь уникальный индекс. Если вы этого не сделаете, то ваши данные подвергаются риску, когда кто-то обновляет информацию, не используя ваше небольшое заявление об обновлении. Текущие предложения по коду не дают вам пример того, как обрабатывать настройку имени пользователя, если используется существующее, что вы хотите сделать? Это должно быть частью вашего процесса. Пользователю нужно имя пользователя.
просто показать здесь - это один из способов обработки увеличения имени пользователя, пока вы не получите имя, которое не существует. Этот пример - вставка, а не обновление, но я думаю, что вы можете использовать его в качестве отправной точки. Используя этот метод (и это для одной записи за один раз), никто не попадает в систему с повторяющимся именем пользователя, и ошибки не выдаются, если существует точное совпадение, он просто переходит к поиску следующего совпадения. р>
CREATE PROC [dbo].[ins_MyUserTable]
(
@userID int,
@Login varchar(255)
)
As
DECLARE
@ValidateUserName varchar(50),
@NewUserName varchar(50),
@CheckUserName varchar(50),
@Holding int
-- Get User Name (first letter of first name + last name)
SELECT @NewUserName = @Login
SET @Holding = 0
-- Examine User Name (must be unique)
SELECT @ValidateUserName = 1
WHILE @ValidateUserName = 1
BEGIN
-- Check for Login
SELECT @CheckUserName = (SELECT TOP 1 login FROM MyUserTable WHERE login = @NewUserName)
IF @CheckUserName = @NewUserName
BEGIN
SELECT @Holding = @Holding + 1
SELECT @NewUserName = @Login + Convert(varchar(2), @Holding)
END
ELSE
BEGIN
SELECT @ValidateUserName = 0
END
END
-- Insert into MyUserTable
INSERT INTO MyUserTable
([user_id], login)
VALUES
(@userID, @NewUserName)