2013-06-20 2 views
0

У меня проблема с обновлением в таблице. В моем ниже у меня есть флаг обновления столбца userdeleted. Я также хочу изменить значение этой строки с помощью значения CurrentTimestamp, но после того, как я поместил еще одно условие в SET, мое значение всех строк обновляется до текущей метки времени.Обновление не работает по мере необходимости

UPDATE dpuserapplication t1 
LEFT OUTER JOIN temp_userapplication t2 
ON t1.userName = t2.userName 
AND t1.ApplicationName = t2.ApplicationName 
AND t1.groupName = t2.groupName 
SET t1.userDeleted = CASE WHEN t2.ID IS NULL THEN 1 ELSE 0 END, 
t1.CreatedDate = CURRENT_TIMESTAMP; 
+0

Я только хочу обновить ту строку, для которой столбец, заданный пользователем, равен 0 не всем строкам. –

ответ

0

Это происходит из-за LEFT OUTER JOIN, который возвращает все строки dpuserapplication, если не указано пункт WHERE. Поскольку вы не указываете какое-либо условие для изменения метки времени, оно изменяется в каждой строке.

Попробуйте добавить условие:

UPDATE dpuserapplication t1 
     LEFT OUTER JOIN temp_userapplication t2 
        ON t1.username = t2.username 
         AND t1.applicationname = t2.applicationname 
         AND t1.groupname = t2.groupname 
SET t1.userdeleted = CASE 
          WHEN t2.id IS NULL THEN 1 
          ELSE 0 
         END, 
     t1.createddate = CASE 
          WHEN t2.id IS NOT NULL THEN CURRENT_TIMESTAMP 
          ELSE t1.createddate 
         END; 

См this fiddle.

После вашего комментария, если вы хотите обновить только те строки, где userdeleted был установлен в 1, и теперь установлено в 0:

UPDATE dpuserapplication t1 
     LEFT OUTER JOIN temp_userapplication t2 
        ON t1.username = t2.username 
         AND t1.applicationname = t2.applicationname 
         AND t1.groupname = t2.groupname 
SET t1.userdeleted = CASE 
          WHEN t2.id IS NULL THEN 1 
          ELSE 0 
         END, 
     t1.createddate = CASE 
          WHEN t2.id IS NOT NULL AND t1.userdeleted = 1 THEN CURRENT_TIMESTAMP 
          ELSE t1.createddate 
         END; 

См this fiddle.

В этой скрипке:

  • u1 имеет userdeleted = 1, но соответствует условиям. Его статус изменяется на 0, а дата обновляется.
  • u2 имеет userdeleted = 0 и соответствует условиям. Его статус установлен в 0 (без изменений), но дата не обновляется.
  • u3 не соответствует условиям, ничего не происходит.
+0

Можем ли мы поставить условие case как используемое для UserDeleted в SET, я новичок в mysql и не имею много знаний об этом –

+0

Да, AFAIK нет проблем с этим. –

+0

, но это не работает .. все строки получает ту же метку времени Afte запуска этого сценария UPDATE dpuserapplication t1 LEFT OUTER JOIN t2 temp_userapplication ON t1.userName = t2.userName И t1.ApplicationName = t2.ApplicationName И t1.groupName = t2.groupName SET t1.userDeleted = CASE КОГДА t2.ID NULL THEN 1 ELSE 0 END, t1.CreatedDate = CASE КОГДА t2.ID NULL THEN CURRENT_TIMESTAMP END; –

Смежные вопросы