web-dev-qa-db-fra.com

MySQL - UPDATE plusieurs lignes avec des valeurs différentes dans une requête

J'essaie de comprendre comment mettre à jour plusieurs lignes avec des valeurs différentes et je ne comprends tout simplement pas. La solution est partout mais pour moi, cela semble difficile à comprendre.

Par exemple, trois mises à jour en 1 requête:

UPDATE table_users
SET cod_user = '622057'
    , date = '12082014'
WHERE user_rol = 'student'
    AND cod_office = '17389551'; 

UPDATE table_users
SET cod_user = '2913659'
    , date = '12082014'
WHERE user_rol = 'assistant'
    AND cod_office = '17389551'; 

UPDATE table_users
SET cod_user = '6160230'
    , date = '12082014'
WHERE user_rol = 'admin'
    AND cod_office = '17389551'; 

Je lire un exemple, mais je ne comprends vraiment pas comment faire la requête. c'est à dire:

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

Je ne suis pas tout à fait clair comment faire la requête s'il y a plusieurs conditions dans WHERE et dans IF condition..any idées?

110
franvergara66

Vous pouvez le faire de cette façon:

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

Je ne comprends pas votre format de date. Les dates doivent être stockées dans la base de données à l'aide de types natifs de date et d'heure.

152
Gordon Linoff

MySQL offre un moyen plus lisible de combiner plusieurs mises à jour en une seule requête. Cela semble mieux correspondre au scénario que vous décrivez, est beaucoup plus facile à lire et évite les conditions difficiles à résoudre.

INSERT INTO table_users (cod_user, date, user_rol, cod_office)
VALUES
('622057', '12082014', 'student', '17389551'),
('2913659', '12082014', 'assistant','17389551'),
('6160230', '12082014', 'admin', '17389551')
ON DUPLICATE KEY UPDATE
 cod_user=VALUES(cod_user), date=VALUES(date)

Cela suppose que la combinaison user_rol, cod_office est une clé primaire. Si le PK ne représente que l’un d’eux, ajoutez l’autre champ à la liste UPDATE. Si aucune d'entre elles n'est une clé primaire (ce qui semble peu probable), cette approche créera toujours de nouveaux enregistrements - probablement pas ce qui est souhaité.

Cependant, cette approche rend les déclarations préparées plus faciles à construire et plus concises.

81
Trevedhek

Vous pouvez utiliser une instruction CASE pour gérer plusieurs scénarios 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';
11
Hart CO
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';
6
Akshay Bhan