Подвыбор SQL в обновлении - PullRequest
       11

Подвыбор SQL в обновлении

1 голос
/ 10 сентября 2009

О, великий Stackoverflow, я умоляю тебя ... Мне нужно сделать следующее:

СОЗДАТЬ УНИКАЛЬНЫЙ ИНДЕКС UserName ON Emp (UserName) - Sheesh!

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

ГДЕ НЕ существует сотрудник с таким именем пользователя.

Ответы [ 4 ]

4 голосов
/ 10 сентября 2009

Да, если вы не читаете дальше, имя пользователя действительно должно быть уникальным, также я бы позаботился, чтобы в предложении 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)
4 голосов
/ 10 сентября 2009

Я бы поставил уникальный индекс на имя пользователя и использовал бы:

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

Если ваша база данных это поддерживает;)

1 голос
/ 10 сентября 2009

Во-первых, ваше поле имени пользователя должно иметь уникальный индекс. Если вы этого не сделаете, то ваши данные подвергаются риску, когда кто-то обновляет информацию, не используя ваше небольшое заявление об обновлении. Текущие предложения по коду не дают вам пример того, как обрабатывать настройку имени пользователя, если используется существующее, что вы хотите сделать? Это должно быть частью вашего процесса. Пользователю нужно имя пользователя.

просто чтобы показать здесь, это один из способов обрабатывать увеличение имени пользователя, пока вы не получите имя, которое не существует. Этот пример - вставка, а не обновление, но я думаю, что вы можете использовать его в качестве отправной точки. Используя этот метод (и это для одной записи за один раз), никто не попадает в систему с повторяющимся именем пользователя, и ошибки не выдаются, если существует точное совпадение, он просто переходит к следующему поиску. 1003 *

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) 
1 голос
/ 10 сентября 2009

Это все еще позволит дублировать ... но если вы хотите, что вы сказали, Попробуйте это (именно то, что вы сказали):

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). Если после этого нет дубликатов, вы можете применить индекс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...