2014-09-04 22 views
52

Sto cercando di capire come AGGIORNARE più righe con valori diversi e io proprio non capisco. La soluzione è ovunque ma a me sembra difficile da capire.MySQL - UPDATE più righe con valori diversi in una query

Per esempio, tre aggiornamenti in 1 query:

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

ho read un esempio, ma io davvero non capisco come fare la query. cioè:

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

io non sono del tutto chiaro come fare la query se ci sono condizioni multiple nel WHERE e nelle idee condition..any IF?

risposta

87

si può fare in questo modo:

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

Non capisco il formato della data. Le date devono essere memorizzate nel database utilizzando i tipi di data e ora nativi.

+0

come posso fare in modo che l'aggiornamento venga eseguito, se il record esiste già – franvergara66

+0

@ franvergara66. . . Non capisco il tuo commento 'update's riguarda solo i record che esistono già. –

+0

Scusa il mio inglese signore, quando provo a fare un aggiornamento mysql dammi l'errore: # 1062 - Duplica la voce 'XXX' per la chiave 'PRIMARY'. Ciò accade quando provo ad aggiornare un record con lo stesso valore che aveva già, esiste un modo per saltare l'aggiornamento se il valore corrente è lo stesso di quello aggiornato? – franvergara66

4

È possibile utilizzare un'istruzione CASE di gestire più if/then scenari:

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

Hai fatto un errore alla fine dell'istruzione CASE: hai 2 virgole l'una accanto all'altra. – pmrotule

42

MySQL permette un modo più leggibile per combinare più aggiornamenti in una singola query. Questo sembra adattarsi meglio allo scenario che descrivi, è molto più facile da leggere ed evita quelle condizioni multiple difficili da districare.

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) 

Ciò presuppone che la combinazione user_rol, cod_office sia una chiave primaria. Se solo uno di questi è il PK, quindi aggiungi l'altro campo all'elenco UPDATE. Se nessuno di questi è una chiave primaria (che sembra improbabile), questo approccio creerà sempre nuovi record, probabilmente non quello che si desidera.

Tuttavia, questo approccio rende le istruzioni preparate più semplici da costruire e più concise.

+2

Grazie!Questo è quello che stavo cercando da molto tempo, il modo più pulito, non riuscivo a capire questa sintassi, in particolare 'cod_user = VALUES (cod_user), ...', anche dai documenti ufficiali di MySQL 5.6 – user3198882

+10

Nota: Questo sarà aggiungi nuove righe se la chiave non esiste nella tabella con conseguente record indesiderati. – Faraz

+0

Ingannevole usare un IODKU mai inserito, ma molto elegante. –

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