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

时间:2015-12-17 20:27:35

标签: mysql sql database rdbms

数据库: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语句中完成吗?

2 个答案:

答案 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'

Demo here

答案 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';