MySQL - UPDATE несколько строк с разными значениями в одном запросе
Я пытаюсь понять, как ОБНОВИТЬ несколько строк с разными значениями, и я просто не понимаю. Решение повсюду, но для меня это трудно понять.
Например, три обновления в 1 запрос:
UPDATE table_users
SET cod_user = '622057'
, date = '12082014'
WHERE user_rol = 'student'
AND cod_office = '123456';
UPDATE table_users
SET cod_user = '2913659'
, date = '12082014'
WHERE user_rol = 'assistant'
AND cod_office = '123456';
UPDATE table_users
SET cod_user = '6160230'
, date = '12082014'
WHERE user_rol = 'admin'
AND cod_office = '123456';
I читает пример, но я действительно не понимаю, как сделать запрос. то есть:
UPDATE table_to_update
SET cod_user= IF(cod_office = '123456','622057','2913659','6160230')
,date = IF(cod_office = '123456','12082014')
WHERE ?? IN (??) ;
Я не совсем понимаю, как выполнить запрос, если в WHERE и в условии IF есть несколько условий: какие-то идеи?
Ответы
Ответ 1
Вы можете сделать это следующим образом:
UPDATE table_users
SET cod_user = (case when user_role = 'student' then '622057'
when user_role = 'assistant' then '2913659'
when user_role = 'admin' then '6160230'
end),
date = '12082014'
WHERE user_role in ('student', 'assistant', 'admin') AND
cod_office = '17389551';
Я не понимаю ваш формат даты. Даты должны храниться в базе данных с использованием собственных типов даты и времени.
Ответ 2
MySQL позволяет более читаемый способ объединить несколько обновлений в один запрос. Это, по-видимому, лучше соответствует сценарию, который вы описываете, гораздо легче читать и избегает трудных для распутывания множественных условий.
INSERT INTO table_users (cod_user, date, user_rol, cod_office)
VALUES
('622057', '12082014', 'student', '123456'),
('2913659', '12082014', 'assistant','123456'),
('6160230', '12082014', 'admin', '123456')
ON DUPLICATE KEY UPDATE
cod_user=VALUES(cod_user), date=VALUES(date)
Предполагается, что комбинация user_rol, cod_office
является первичным ключом. Если только один из них является PK, добавьте другое поле в список UPDATE.
Если ни один из них не является первичным ключом (что кажется маловероятным), то этот подход всегда будет создавать новые записи - возможно, не то, что нужно.
Однако этот подход упрощает сбор и упрощение подготовленных инструкций.
Ответ 3
Вы можете использовать оператор CASE
для обработки нескольких сценариев if/then:
UPDATE table_to_update
SET cod_user= CASE WHEN user_rol = 'student' THEN '622057'
WHEN user_rol = 'assistant' THEN '2913659'
WHEN user_rol = 'admin' THEN '6160230'
END
,date = '12082014'
WHERE user_rol IN ('student','assistant','admin')
AND cod_office = '17389551';
Ответ 4
update table_name
set cod_user =
CASE
WHEN user_rol = 'student' THEN '622057'
WHEN user_rol = 'assistant' THEN '2913659'
WHEN user_rol = 'admin' THEN '6160230'?
END,date = '12082014'
WHERE user_rol IN ('student','assistant','admin')
AND cod_office = '17389551';