Это происходит из-за 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 не всем строкам. –