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