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

MySQL-Verhalten von ON DUPLICATE KEY UPDATE für mehrere UNIQUE-Felder

Betrachten Sie

INSERT INTO table (a,b,c) VALUES (1,2,3)
    -> ON DUPLICATE KEY UPDATE c=c+1;

Wenn a und b UNIQUE sind Felder, UPDATE tritt auf bei a = 1 OR b = 2 . Auch wenn Bedingung a = 1 OR b = 2 von zwei oder mehr Einträgen erfüllt wird, erfolgt die Aktualisierung nur einmal.

Bsp hier Tabelle Tabelle mit Id und Name UNIQUE Felder

Id     Name     Value 
1      P        2 
2      C        3 
3      D        29 
4      A        6

Wenn Abfrage ist

INSERT INTO table (Id, Name, Value)
VALUES (1, C, 7);

dann bekommen wir

Id     Name     Value 
1      P        2 
2      C        3 
3      D        29 
4      A        6
1      C        7

was die Eindeutigkeit von ID und Name verletzt. Jetzt mit

INSERT INTO table (Id, Name, Value)
VALUES (1, C, 7)
ON DUPLICATE KEY UPDATE Value = 7;

wir bekommen

Id     Name     Value 
1      P        7 
2      C        7 
3      D        29 
4      A        6

Das Verhalten bei mehreren Tasten ist wie folgt

UPDATE in ON DUPLICATE KEY UPDATE wird durchgeführt, wenn einer der UNIQUE Feld gleich dem einzufügenden Wert. Hier UPDATE wird auf Id = 1 OR Name = C durchgeführt . Es ist äquivalent zu

UPDATE table 
SET Value = 7
WHERE Id = 1 OR Name = C;

Was ist, wenn ich nur ein Update für beide Schlüssel möchte

Kann UPDATE verwenden Anweisung mit LIMIT Schlüsselwort

UPDATE table 
SET Value = 7
WHERE Id = 1 OR Name = C
LIMIT 1;

was geben wird

Id     Name     Value 
1      P        7 
2      C        3 
3      D        29 
4      A        6

Was ist, wenn ich nur eine Aktualisierung möchte, wenn die Werte für beide Schlüssel übereinstimmen

Eine Lösung ist ALTER TABLE und machen Sie den PRIMARY KEY (oder Eindeutigkeit) arbeiten auf beiden Feldern.

ALTER TABLE table 
DROP PRIMARY KEY,
ADD PRIMARY KEY (Id, Name);

Jetzt auf

INSERT INTO table (Id, Name, Value)
VALUES (1, C, 7)
ON DUPLICATE KEY UPDATE Value = 7;

wir bekommen

Id     Name     Value 
1      P        2 
2      C        3 
3      D        29 
4      A        6
1      C        7

da kein Duplikat (auf beiden Schlüsseln) gefunden wird.