これは、句を指定しない限り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;
このフィドルを参照してください。
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;
このフィドルを参照してください。
このフィドルで:
- u1 は userdeleted = 1 ですが、条件を満たしています。そのステータスは 0 に変更され、日付が更新されます。
- u2 は userdeleted = 0 であり、条件に適合します。そのステータスは 0 (変更なし) に設定されますが、日付は更新されません。
- u3 は条件に適合しません。何も起こりません。