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

时间:2019-01-03 15:44:36

标签: mysql mysql-workbench

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

我要实现的目标: 我需要通过stratodesk更新一堆瘦客户机PC,不幸的是没有大量更新可以做到这一点,所以我直接使用MySQL数据库。目标是更新使用的映像和更新模式。

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

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

我做了一些谷歌搜索,很多例子都像这样(我知道这个例子并不反映我正在使用的数据库结构)。

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”的值用单引号引起来,则会出现有关截断错误双打的错误。如果我使用双引号,查询将更新“ 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%正常工作!

此致

Philb

1 个答案:

答案 0 :(得分:0)

如果要更新另一行的值等于给定值的行中的列,则应使用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');