Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

INSERT INTO ou UPDATE com duas condições


é isso que insert on duplicate key update é para.

A página do Manual está aqui .

O truque é que a tabela precisa ter uma chave única (pode ser uma composição) para que o clash de fazer uma inserção pode ser detectado. Como tal, a atualização deve ocorrer nessa linha, caso contrário, uma inserção. Pode ser uma chave primária, é claro.

No seu caso, você pode ter uma chave composta como
unique key(theName,theDate)

Se a linha já estiver lá, o clash é detectado e a atualização acontece.

Aqui está um exemplo 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;

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

Como esperado, inserir na atualização de chave duplicada funciona, apenas 2 linhas.