Mysql
 sql >> Datenbank >  >> RDS >> Mysql

INSERT INTO oder UPDATE mit zwei Bedingungen

das ist, was insert on duplicate key update ist für.

Die Handbuchseite dafür ist hier .

Der Trick besteht darin, dass die Tabelle einen eindeutigen Schlüssel haben muss (kann zusammengesetzt sein), damit der clash eine Einfügung zu tun, kann erkannt werden. Daher muss die Aktualisierung in dieser Zeile erfolgen, andernfalls eine Einfügung. Es kann natürlich auch ein Primärschlüssel sein.

In Ihrem Fall könnten Sie einen zusammengesetzten Schlüssel wie

haben
unique key(theName,theDate)

Wenn die Zeile bereits vorhanden ist, wird der clash erkannt und die Aktualisierung erfolgt.

Hier ist ein vollständiges Beispiel

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;

Ergebnisse anzeigen

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

Wie erwartet funktioniert das Einfügen bei doppelter Schlüsselaktualisierung, nur 2 Zeilen.