Pergunta

Oh grande Stackoverflow, peço-te ... Eu preciso fazer o seguinte:

CREATE UNIQUE INDEX nome de usuário em Emp (username) - Sheesh

UPDATE Emp SET
UserName = Left(FirstName,1)+LastName

ONDE NÃO existe um empregado com esse nome de usuário já.

Foi útil?

Solução

Isso ainda permitirá duplicatas ... mas se você quiser que você disse, Tente isto (exatamente o que você disse):

UPDATE Emp SET
   UserName = Left(FirstName,1) + LastName
Where Not Exists (Select * From Emp 
                  Where UserName = Left(FirstName,1) + LastName)

Eu acho, porém, que você está tentando evitar duplicações, nomes de usuário e não apenas de reposição onde ninguém existente é o mesmo que o novo valor proposto. Se assim for, você deve adicionar um índice exclusivo na coluna userName, mas primeiro, execute o seguinte:

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)

Isto irá repor todos os nomes de usuário que pode ser reposto sem criar duplicatas. (Não vai eliminar Dupes existentes). Se não houver dupes após isso, você pode aplicar o índice.

Outras dicas

Gostaria de colocar um índice exclusivo no nome de usuário e uso:

UPDATE IGNORE Emp SET UserName = Left(FirstName,1)+LastName

Se o seu banco de dados suporta isso;)

Sim, caso você não leia mais abaixo nome de usuário realmente deve ser único também gostaria de fazer se há algo mais na cláusula WHERE, porque isso vai ser uma consulta intensa.

Você pode considerar a escrever uma função para fazer isso para você adicionar alguma outra singularidade ou id para o final, se existir (Count (*) onde username como nome de usuário).

UPDATE Emp SET
UserName = Left(FirstName,1)+LastName
WHERE
UserName not in (Select UserName From Emp Where UserName = Left(FirstName,1) + LastName)

Em primeiro lugar, o seu campo de nome de usuário deve ter um índice exclusivo. Se você don; t, em seguida, seus dados estão na forma de risco alguém atualizar sem usar o instrução de atualização pouco. sugestões de código atual não lhe dar um exemplo de como lidar com a definição do nome do usuário, se o existente é usado, o que você quer fazer? Isso deve ser parte do seu processo. O usuário precisa de um nome de usuário.

apenas para mostrar aqui é uma maneira de lidar com o incremento do nome de usuário até que você obtenha um que não existe. Este exemplo é uma inserção não uma atualização, mas eu acho que você pode usá-lo como um ponto de partida. Usando esse método (e isto é para um registro de cada vez inserções), ninguém nunca entra no sistema com um nome de usuário duplicado e erros não são lançada se uma correspondência exata existe, justs se move para encontrar o próximo jogo.

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) 
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top