Mysql
 sql >> Base de données >  >> RDS >> Mysql

INSERT INTO ou UPDATE avec deux conditions

c'est ce que insert on duplicate key update est pour.

La page de manuel correspondante est ici .

L'astuce est que la table doit avoir une clé unique (peut être un composite) pour que le clash de faire un insert peut être détecté. En tant que tel, la mise à jour doit se produire sur cette ligne, sinon une insertion. Il peut s'agir d'une clé primaire, bien sûr.

Dans votre cas, vous pourriez avoir une clé composite telle que

unique key(theName,theDate)

Si la ligne est déjà là, le clash est détecté et la mise à jour se produit.

Voici un exemple complet

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;

afficher les résultats

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

Comme prévu, l'insertion sur la mise à jour de la clé en double fonctionne, seulement 2 lignes.