Вопрос

О, великий 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) 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top