Mysql
 sql >> Database >  >> RDS >> Mysql

INSERT INTO o UPDATE con due condizioni

questo è ciò che insert on duplicate key update è per.

La relativa pagina del manuale è qui .

Il trucco è che la tabella deve avere una chiave univoca (può essere composta) in modo che il clash di fare un inserimento può essere rilevato. In quanto tale, l'aggiornamento si verifica su quella riga, altrimenti un inserto. Può essere una chiave primaria, ovviamente.

Nel tuo caso, potresti avere una chiave composita come

unique key(theName,theDate)

Se la riga è già presente, il clash viene rilevato e l'aggiornamento avviene.

Ecco un esempio completo

create table myThing
(   id int auto_increment primary key,
    name int not null,
    values1 int not null,
    values2 int not null,
    dates date not null,
    unique key(name,dates) -- <---- this line here is darn important
);

insert myThing(name,values1,values2,dates) values (777,1,1,'2015-07-11') on duplicate key update values2=values2+1;
insert myThing(name,values1,values2,dates) values (778,1,1,'2015-07-11') on duplicate key update values2=values2+1;
-- do the 1st one a few more times:
insert myThing(name,values1,values2,dates) values (777,1,1,'2015-07-11') on duplicate key update values2=values2+1;
insert myThing(name,values1,values2,dates) values (777,1,1,'2015-07-11') on duplicate key update values2=values2+1;
insert myThing(name,values1,values2,dates) values (777,1,1,'2015-07-11') on duplicate key update values2=values2+1;

mostra i risultati

select * from myThing;
+----+------+---------+---------+------------+
| id | name | values1 | values2 | dates      |
+----+------+---------+---------+------------+
|  1 |  777 |       1 |       4 | 2015-07-11 |
|  2 |  778 |       1 |       1 | 2015-07-11 |
+----+------+---------+---------+------------+

Come previsto, l'inserimento su chiave duplicata di aggiornamento funziona, solo 2 righe.