MySQL-обновление нескольких строк с разными значениями в одном запросе


Я пытаюсь понять, как обновить несколько строк с разными значениями, и я просто не понимаю. Решение есть везде, но мне кажется, что это трудно понять.

например, три обновления в 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'; 

Я читать пример, но я действительно не понимаю, как сделать запрос. я.е:

UPDATE table_to_update
SET cod_user= IF(cod_office = '123456','622057','2913659','6160230')
    ,date = IF(cod_office = '123456','12082014')
WHERE ?? IN (??) ;

Я не совсем ясно, как сделать запрос, если есть несколько условий в WHERE и в IF состояние..есть идеи?

4 73

4 ответа:

вы можете сделать это так:

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';

Я не понимаю ваш формат даты. Даты должны храниться в базе данных с использованием собственных типов даты и времени.

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

тем не менее, этот подход делает подготовленные заявления легче строить и более кратким.

можно использовать 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';
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';