mysql - 使用 MySQL Workbench 更新同一列中的多个值

标签 mysql mysql-workbench

我需要运行 mysql 查询来更新 Stratodesk 数据库。

我想要实现的目标: 我需要通过 Stratodesk 更新一大堆瘦客户端 PC,不幸的是没有批量更新来执行此操作,所以我直接使用 MySQL 数据库。目标是更新所使用的图像和更新模式。

我有两个 MySQL 查询来执行此操作,其中一个将更新图像本身,另一个将更新“图像更新模式”。

如果我运行第一个查询,它将更新图像,但如果运行第二个查询来更新图像更新模式,它将撤消第一个查询。我的计划是将两个查询组合在一起并立即更新两个值。

我做了一些谷歌搜索,很多示例都是这样的(我知道这个示例没有反射(reflect)我正在使用的数据库结构)。

UPDATE orders SET 
    listPrice = 0, 
    bloggerPrice = 0.00, 
    customerPrice = 0.00 
WHERE 
    orders.id = 245745

来自This stack overflow topic

现在,这给我的印象是每个值都作为单独的列存储在表“orders”中。我非常确定如果 stratodesk 的数据库遵循类似的模式,这会起作用,但事实并非如此。

他们将所有这些存储在名为“CONFIGVALUE”的表中 - 该表有两列。 “CODE”和“VAL”是我要更新的值所在的位置。

我需要更新 a) 图像

SET CONFIGVALUE.CODE = 'IMAGE',CONFIGVALUE.VAL="2.40.4130d-EEs-k305-181109"

b) 公告模式

SET CONFIGVALUE.CODE = "IMAGE_UPDATE_MODE", CONFIGVALUE.VAL=2

正如我所说,如果我运行每个,它就会更新数据库。但是,第二个查询似乎撤消了第一个查询。

我将它们组合在一起,认为这可以解决我的问题,但事实并非如此。如果我将“image”的值用单引号引起来,则会收到有关截断不正确的 double 的错误。如果我使用双引号,查询将更新“image_update_mode”,但对“IMAGE”值不执行任何操作。

组合查询:

UPDATE IGNORE CONFIGVALUE JOIN CONFIGOBJECT on CONFIGOBJECT.COID=CONFIGVALUE.COID JOIN CLIENTSTATE on CONFIGOBJECT.COID=CLIENTSTATE.COID  JOIN STATUSVALUE on CLIENTSTATE.EID=STATUSVALUE.EID SET CONFIGVALUE.CODE = 'IMAGE', CONFIGVALUE.VAL='2.40.4130d-EEs-k305-181109', CONFIGVALUE.CODE = 'IMAGE_UPDATE_MODE', CONFIGVALUE.VAL=2 WHERE CONFIGOBJECT.PARENT=1221 AND CONFIGOBJECT.COTYPE=3 /*AND STATUSVALUE.VAL="HP t510 Thin Client"*/ AND CONFIGOBJECT.COID=895;

StratoDesk database layout

我非常确信很多问题都来自于这些值都存储在同一列中。在我看来,这些值应该有自己的列(可能有自己的表)。

第二个问题,基于 StratoDesk 数据库布局,看起来是否存在某种标准化?我仍在努力解决这个问题。我觉得如果是的话,事情会容易得多,或者至少我见过的例子会更有意义。

有人知道我怎样才能实现这个目标吗?或者过去有人尝试过类似的事情吗?如果有人有,查询看起来是否正确,或者是否有更干净的方法来执行此操作?我有几千个瘦客户端需要更新,因此希望在开始更新所有瘦客户端之前使其 100% 正常工作!

问候,

菲尔布

最佳答案

如果要更新行中的某列,其中另一行的值等于给定值,则应使用 WHERE 子句。

更新图像:

UPDATE configvalue
       SET val = '2.40.4130d-EEs-k305-181109'
       WHERE code = 'IMAGE';

更新图像更新模式:

UPDATE configvalue
       SET val = '2'
       WHERE code = 'IMAGE_UPDATE_MODE';

如果没有 WHERE,您可以更改所有行中的 val

如果您非常希望将其作为一个语句,您可以使用 CASE 表达式,如果代码与该值所对应的代码匹配,则该表达式返回新值,否则仅返回旧值。

UPDATE configvalue
       SET val = CASE code
                   WHEN 'IMAGE' THEN
                     '2.40.4130d-EEs-k305-181109'
                   WHEN 'IMAGE_UPDATE_MODE' THEN
                     '2'
                   ELSE
                     val
                 END
       WHERE code IN ('IMAGE',
                      'IMAGE_UPDATE_MODE');

关于mysql - 使用 MySQL Workbench 更新同一列中的多个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54025528/

相关文章:

themes - MySQL Workbench 深色主题

mysql - 如何按多列而不是按值排序?

mysql - 尝试在 mysql 数据库中持久保存一个对象

mysql - 获取当前日期(月)起两个不同年份的月份和记录列表

mysql - 根据时区而不是 utc 显示创建的 AT 时间戳

MySQL远程访问不可能

mysql - Phoenix-Framework : transform, 在创建子模型时关联和不检查 Ecto 父模型

php - MySQL:键/值存储查询优化

SQL Server 查询语法

mysql - 根据文本 SQL 查询的一部分获取唯一字段