数据库: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 ║ ║
╚════╩════════════╩══════╩════════╝
上的表(名称、类型)有一个唯一的约束
我想用name="arney"更新不重复的"fred"记录以及软删除(更新状态列)将是重复的任何记录。
╔════╦════════════╦══════╦════════╗
║ ID ║ NAME ║ TYPE ║ STATUS ║
╠════╬════════════╬══════╬════════╣
║ 1 ║ barney ║ A ║ ║
║ 2 ║ barney ║ B ║ ║
║ 3 ║ wilma ║ B ║ ║
║ 4 ║ fred ║ B ║ DEL ║
║ 5 ║ barney ║ C ║ ║
║ 6 ║ Betty ║ A ║ ║
╚════╩════════════╩══════╩════════╝
这可以在一条sql语句中完成吗?
您可以使用以下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
字段。CCD_ 7在这种情况下保持不变 - 如果
t2.name IS NOT NULL
存在匹配,则name
保持不变,并且status
被更新为'DEL'
此处演示
这可以在一条语句中完成。回答您的具体问题:
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';