Использование MySQL Workbench для обновления нескольких значений в тех же столбцах - PullRequest
0 голосов
/ 03 января 2019

Мне нужно выполнить запрос mysql для обновления базы данных стратодеска.

Чего я пытаюсь достичь: Мне нужно обновить целую кучу тонких клиентских ПК через стратодеск, к сожалению, для этого нет массового обновления, поэтому я работаю напрямую с базой данных MySQL. Цель состоит в том, чтобы обновить используемый образ и режим обновления.

Для этого у меня есть два запроса MySQL, один из которых обновит само изображение, другой обновит «режим обновления изображения».

если я выполню первый запрос, он обновит изображение, но если затем выполнить второй запрос, чтобы обновить режим обновления изображения, он отменит первый запрос. Мой план состоял в том, чтобы объединить оба запроса вместе и обновить оба значения одновременно.

Я немного погуглил, и многие примеры выглядят примерно так (я знаю, этот пример не отражает структуру базы данных, с которой я работаю).

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

С Тема переполнения стека

Теперь у меня складывается впечатление, что каждое из значений там хранится в виде отдельной колонки в таблице «заказы». Я почти уверен, что это сработало бы, если бы база данных для стратодесков следовала аналогичной схеме, но это не так.

Они хранят все это в таблице с именем "CONFIGVALUE" - в ней есть два столбца. «CODE» и «VAL», где находятся значения, которые я хочу обновить.

Мне нужно обновить а) изображение

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

б) режим объявления

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

Как я уже сказал, если я запускаю каждый из них, он обновляет базу данных. Но второй запрос, по-видимому, отменяет первый.

Я объединил их вместе, думая, что это решит мою проблему, но это не так. Если я оберну значение для «изображения» в одинарных кавычках, я получу ошибку об усечении неправильных двойных чисел. Если я использую двойные кавычки, запрос обновит «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

Я в значительной степени убедил себя, что большая проблема заключается в том, что оба значения хранятся в одних и тех же столбцах. На мой взгляд, эти значения должны иметь свои собственные столбцы (возможно, свои собственные таблицы).

Вторичный вопрос, основанный на макете базы данных StratoDesk, похоже, что существует какая-либо нормализация? Я все еще пытаюсь обдумать это. Я чувствую, что было бы намного проще, если бы они были, или, по крайней мере, примеры, которые я видел, имели бы больше смысла.

Кто-нибудь знает, как мне этого добиться? Или кто-нибудь пробовал что-то подобное в прошлом? Если у кого-то есть, выглядит ли запрос правильно или есть более чистый способ сделать это? У меня есть несколько тысяч тонких клиентов для обновления, поэтому я хотел бы, чтобы эти 100% работали, прежде чем я начну обновлять все тонкие клиенты!

С уважением,

Philb

1 Ответ

0 голосов
/ 03 января 2019

Если вы хотите обновить столбец в строке, где значения другой строки соответствуют указанному значению, вы должны использовать предложение 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');
...