数据库:MySql 5.6.x
我有一个表,我想以两种不同的方式更新行。
╔════╦════════════╦══════╦════════╗
║ ID ║ NAME ║ TYPE ║ STATUS ║
╠════╬════════════╬══════╬════════╣
║ 1 ║ fred ║ A ║ ║
║ 2 ║ barney ║ B ║ ║
║ 3 ║ wilma ║ B ║ ║
║ 4 ║ fred ║ B ║ ║
║ 5 ║ fred ║ C ║ ║
║ 6 ║ Betty ║ A ║ ║
╚════╩════════════╩══════╩════════╝
表上有一个唯一约束(名称,类型)
我想更新非重复的“fred”#39;姓名=' barney' 和软删除(更新状态列)任何可能重复的记录。
╔════╦════════════╦══════╦════════╗
║ ID ║ NAME ║ TYPE ║ STATUS ║
╠════╬════════════╬══════╬════════╣
║ 1 ║ barney ║ A ║ ║
║ 2 ║ barney ║ B ║ ║
║ 3 ║ wilma ║ B ║ ║
║ 4 ║ fred ║ B ║ DEL ║
║ 5 ║ barney ║ C ║ ║
║ 6 ║ Betty ║ A ║ ║
╚════╩════════════╩══════╩════════╝
可以在单个sql语句中完成吗?
答案 0 :(得分:2)
您可以使用以下UPDATE
声明:
UPDATE mytable t1
LEFT JOIN mytable t2 ON t1.type = t2.type AND t2.name = 'barney'
SET t1.name = CASE
WHEN t2.name IS NULL THEN 'barney'
ELSE t1.name
END,
t1.status = CASE
WHEN t2.name IS NULL THEN t2.status
ELSE 'DEL'
END
WHERE t1.name = 'fred';
我们的想法是使用LEFT JOIN
操作:匹配记录表示发生了UPDATE
的重复。
因此:
t2.name IS NULL
没有匹配且UPDATE
可以更改name
字段。在这种情况下,status
保持不变。t2.name IS NOT NULL
匹配,则name
保持不变,status
更新为'DEL'
。答案 1 :(得分:0)
这可以在一个声明中完成。回答你的具体问题:
update t
set name = (case when id = 4 then name else 'barney' end),
status = (case when id = 4 then 'DEL' else status end)
where t.name = 'fred';