我可以根据重复行的存在有选择地更新行吗?

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'

Demo here