sql >> Databasteknik >  >> RDS >> Mysql

INFOGA I eller UPPDATERA med två villkor

det är vad insert on duplicate key update är för.

Manualsidan för den finns här .

Tricket är att tabellen måste ha en unik nyckel (kan vara en sammansatt) så att clash att göra en insättning kan upptäckas. Som sådan kommer uppdateringen att ske på den raden, annars en infogning. Det kan naturligtvis vara en primärnyckel.

I ditt fall kan du ha en sammansatt nyckel som t.ex.

unique key(theName,theDate)

Om raden redan finns där, clash upptäcks och uppdateringen sker.

Här är ett komplett exempel

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;

visa resultat

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

Som förväntat, infoga på dubblettnyckeluppdatering fungerar, bara 2 rader.



  1. Kan vi skicka parametrar till en vy i SQL?

  2. SQL INSERT INTO från flera tabeller

  3. Mallmönster och modifierare för numerisk formatering i PostgreSQL

  4. Postgres:Hur konverterar man en json-sträng till text?