Mysql 我可以根据重复行的存在选择性地更新行吗?
数据库:MySql 5.6.x 我有一个表,我想用两种不同的方式更新行Mysql 我可以根据重复行的存在选择性地更新行吗?,mysql,sql,database,rdbms,Mysql,Sql,Database,Rdbms,数据库:MySql 5.6.x 我有一个表,我想用两种不同的方式更新行 ╔════╦════════════╦══════╦════════╗ ║ ID ║ NAME ║ TYPE ║ STATUS ║ ╠════╬════════════╬══════╬════════╣ ║ 1 ║ fred ║ A ║ ║ ║ 2 ║ barney ║ B ║ ║ ║ 3 ║ wilma ║ B ║
╔════╦════════════╦══════╦════════╗
║ ID ║ NAME ║ TYPE ║ STATUS ║
╠════╬════════════╬══════╬════════╣
║ 1 ║ fred ║ A ║ ║
║ 2 ║ barney ║ B ║ ║
║ 3 ║ wilma ║ B ║ ║
║ 4 ║ fred ║ B ║ ║
║ 5 ║ fred ║ C ║ ║
║ 6 ║ Betty ║ A ║ ║
╚════╩════════════╩══════╩════════╝
表上有唯一的约束(名称、类型)
我想用class='barney'更新不重复的'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 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';
您可以使用以下
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';
我们的想法是使用左连接操作:匹配的记录表明发生了更新
因此:
- 如果
t2.name为空
则不存在匹配项,UPDATE
可以更改name
字段<代码>状态在这种情况下保持不变
- 如果
t2.name不为NULL
则存在匹配项,因此name
保持不变,状态
更新为'DEL'
感谢您的回复…我想更新所有“fred”记录,但我不知道这些记录的id…我可以通过“名称”而不是id来完成吗?因此,如果将记录“名称”列更改为“barney”会导致重复,请将状态列改为“DEL”。这是一个扣篮!工作完美。非常感谢。