MySQL-aktualizacja wielu wierszy o różnych wartościach w jednym zapytaniu

Próbuję zrozumieć, jak zaktualizować wiele wierszy o różnych wartościach i po prostu tego nie rozumiem. Rozwiązanie jest wszędzie, ale dla mnie wygląda na trudne do zrozumienia.

Na przykład trzy aktualizacje w 1 zapytaniu:

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 przeczytać przykład, ale naprawdę nie rozumiem, jak zrobić zapytanie. i. E:

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

Nie jestem do końca jasne, jak zrobić zapytanie, jeśli istnieje wiele warunków w WHERE I w warunku IF..jakieś pomysły?

Author: ROMANIA_engineer, 2014-09-05

4 answers

Możesz to zrobić w ten sposób:

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';
Nie rozumiem twojego formatu daty. Daty powinny być przechowywane w bazie danych przy użyciu natywnych typów daty i czasu.
 111
Author: Gordon Linoff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-13 22:11:14

MySQL pozwala na bardziej czytelny sposób łączenia wielu aktualizacji w jedno zapytanie. Wydaje się, że lepiej pasuje do scenariusza, który opisujesz, jest o wiele łatwiejszy do odczytania i pozwala uniknąć tych trudnych do rozwikłania wielu warunków.

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)

Zakłada się, że kombinacja user_rol, cod_office jest kluczem podstawowym. Jeśli tylko jednym z nich jest PK, dodaj drugie pole do listy aktualizacji. Jeśli żaden z nich nie jest kluczem podstawowym (wydaje się to mało prawdopodobne) to takie podejście zawsze będzie tworzyć nowe rekordy-prawdopodobnie nie to, co jest pożądane.

Jednak takie podejście sprawia, że przygotowane oświadczenia są łatwiejsze do zbudowania i bardziej zwięzłe.

 56
Author: John Trevithick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-27 15:41:21

Możesz użyć instrukcji CASE do obsługi wielu scenariuszy 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';
 7
Author: Hart CO,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-14 02:39:37
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';
 3
Author: Akshay Bhan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-11 08:02:00