我可以根据重复行的存在有选择地更新行吗?
Can I selectively update rows based on existence of duplicate rows?
数据库:MySql5.6.x
我有一个 table,我想以两种不同的方式更新行。
╔════╦════════════╦══════╦════════╗
║ ID ║ NAME ║ TYPE ║ STATUS ║
╠════╬════════════╬══════╬════════╣
║ 1 ║ fred ║ A ║ ║
║ 2 ║ barney ║ B ║ ║
║ 3 ║ wilma ║ B ║ ║
║ 4 ║ fred ║ B ║ ║
║ 5 ║ fred ║ C ║ ║
║ 6 ║ Betty ║ A ║ ║
╚════╩════════════╩══════╩════════╝
table(名称,类型)
有唯一约束
我想更新 name='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';
想法是使用 LEFT JOIN
操作:匹配的记录表示重复发生了 UPDATE
。
因此:
- 如果
t2.name IS NULL
没有匹配,UPDATE
可以更改name
字段。 status
在这种情况下保持不变。
- 如果
t2.name IS NOT NULL
匹配,则 name
保持不变,status
更新为 'DEL'
。
数据库:MySql5.6.x
我有一个 table,我想以两种不同的方式更新行。
╔════╦════════════╦══════╦════════╗
║ ID ║ NAME ║ TYPE ║ STATUS ║
╠════╬════════════╬══════╬════════╣
║ 1 ║ fred ║ A ║ ║
║ 2 ║ barney ║ B ║ ║
║ 3 ║ wilma ║ B ║ ║
║ 4 ║ fred ║ B ║ ║
║ 5 ║ fred ║ C ║ ║
║ 6 ║ Betty ║ A ║ ║
╚════╩════════════╩══════╩════════╝
table(名称,类型)
有唯一约束我想更新 name='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';
想法是使用 LEFT JOIN
操作:匹配的记录表示重复发生了 UPDATE
。
因此:
- 如果
t2.name IS NULL
没有匹配,UPDATE
可以更改name
字段。status
在这种情况下保持不变。 - 如果
t2.name IS NOT NULL
匹配,则name
保持不变,status
更新为'DEL'
。