Explanation
I have a bunch of columns that don't have a unique constraint, since multiple rows can contain the same values. However, each row will have unique values (with the exception of zero) within the columns I'm trying to update.

Example

| ID | col1 | col2 | col3 |
|----|------|------|------|
| 1  | 2    | 3    | 4    |
| 2  | 2    | 4    | 3    |

我希望将ID1行中的值3更改为0,但是我不知道值3是在col1、col2还是col3内.

What I thought of myself
A possible solution would be:

UPDATE table SET col1 = 0 WHERE ID = 1 AND col1 = 3;
UPDATE table SET col2 = 0 WHERE ID = 1 AND col2 = 3;
UPDATE table SET col3 = 0 WHERE ID = 1 AND col3 = 3;

这会管用,但对我来说效率很低.特别是因为我的实际数据总共包含9个相关列.我很确定,我不应该每次都要执行9个查询才能得到我想要的结果.

所以我的问题是,是否有更好、更有效的解决方案来解决这个问题?

推荐答案

根据您的描述,您可以try 在更新逻辑中使用IF,否则在一条语句中使用原始值.

UPDATE table 
SET col1 = IF(col1 = 3,0,col1),
    col2 = IF(col2 = 3,0,col2),
    col3 = IF(col3 = 3,0,col3)  
    --...
WHERE ID = 1 

如果已经在更新列上设置了索引,那么可以try 将其添加到where筛选器中,这样可能会获得更好的性能

UPDATE table 
SET col1 = IF(col1 = 3,0,col1),
    col2 = IF(col2 = 3,0,col2),
    col3 = IF(col3 = 3,0,col3)  
    --...
WHERE ID = 1 AND 
(col1 = 3) OR
(col2 = 3) OR
(col3 = 3) 

Mysql相关问答推荐

mysql查询汇总数据

MySQL在带有特定属性值上的对象的数组的杨森对象中搜索

筛选器中的Case When语句

如何在Sequelize中创建限制查询?

SQL不断返回查询失败,并且不知道从这里到哪里go

约会时的意外行为

mysql 代码给我的外键格式不正确

将 Cloud Function (nodejs) 连接到 CloudSQL mySQL 数据库

如何使用等于、喜欢和不等于在 json 字段上编写查询?

仅当 SELECT 语句在 MySQL 中给出空集时才执行 UPDATE 语句

SQL:如何为给定组中的所有记录 Select 一列与另一列不匹配的位置

从三个不同的表中生成两列,并使用分组变量计算这些列的比率

当每组的列值发生变化时 Select 并连接行

如何解决这个特定的 SQL 查询?我的解决方案还返回不想要的值

MySQL中的会话客户端是什么

phpmyadmin没有收到要导入的数据错误,如何解决?

Sequelize Query 查找日期范围内的所有记录

如何将 MySQL 查询结果存储在另一个表中?

MySQL - 重复表

带有 WHERE 子句的 MySql 内连接