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

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 ║

数据库: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    ║        ║
╚════╩════════════╩══════╩════════╝
表上有唯一的约束(名称、类型)

我想用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”。这是一个扣篮!工作完美。非常感谢。