2013-05-04 6 views
16

Von MySQL DUPLIZIEREN an ist es möglich, ON DUPLICATE KEY UPDATE Anweisung hinzufügen Verhalten angeben, wenn Werte eingefügt (mit INSERT oder SET oder VALUES) sind bereits in Zieltabelle w.r.t. PRIMARY KEY oder einige UNIQUE Feld. Wenn der Wert für PRIMARY KEY oder ein UNIQUE Feld bereits in der Tabelle enthalten ist, wird INSERT durch UPDATE ersetzt.MySQL Verhalten von ON 4.1.0 KEY UPDATE für mehrere UNIQUE Felder

  • Wie ON DUPLICATE KEY UPDATE verhalten, falls es mehrere UNIQUE Felder in meinem Tisch?

  • Kann ich nur ein Update haben, wenn das Feld UNIQUE übereinstimmt?

  • Kann ich ein Update nur haben, wenn beide Felder UNIQUE gleichzeitig übereinstimmen?

Antwort

20

Betrachten

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

, wenn a und b UNIQUE Felder sind, UPDATE tritt auf a = 1 OR b = 2. Auch wenn die Bedingung a = 1 OR b = 2 durch zwei oder mehr Einträge erfüllt ist, wird die Aktualisierung nur einmal durchgeführt.

Ex hier Tabelle Tabelle mit ID und den Namen UNIQUE Felder

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

Wenn Abfrage

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 

die Einzigartigkeit von Id und Namen 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 

Verhalten auf mehreren Tasten ist die folgende

UPDATE in ON DUPLICATE KEY UPDATE durchgeführt wird, wenn eine der UNIQUE Feld den Wert gleich eingefügt werden. Hier wird UPDATE unter Id = 1 OR Name = C ausgeführt.Es entspricht

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

Was passiert, wenn ich nur ein Update wollen, für jede der beiden Tasten

UPDATE Anweisung mit LIMIT Stichwort

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

die

Id  Name  Value 
1  P  7 
2  C  3 
3  D  29 
4  A  6 
geben verwenden können

Was passiert, wenn ich nur ein Update wollen, wenn Werte für beide Tasten

Eine Lösung abgestimmt sind, ist zu ALTER TABLE und die PRIMARY KEY (oder Einzigartigkeit) machen auf beiden Feldern arbeiten.

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

nun 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 Tasten) gefunden wird.

+1

Wenn Sie eine Tabelle mit zwei Spalten als Primärschlüssel haben, und wollen mit der ON DUPLICATE KEY arbeiten, vermeiden müssen einen eindeutigen Index für die pk Spalten hinzufügen, da dies zu aktualisieren, wenn pk1 oder pk2 sind in den Werten vorhanden. – jloria

+2

Gibt es eine Möglichkeit, eine eindeutige Einschränkung für die zweite Spalte zu haben, aber so, dass sie diese doppelte Schlüsselaktualisierung nicht beeinflusst? Dies bedeutet, dass das Einfügen oder Aktualisieren fehlschlägt, wenn die eindeutige Einschränkung nicht erfüllt ist. – CMCDragonkai

0
  1. wie funktioniert MySQL verhalten ... Es wie erwartet verhält, dass führt ON DUPLICATE KEY-Klausel ist.

  2. Kann ich ein Update für beide haben ... In Wirklichkeit haben Sie nur eine ON DUPLICATE KEY-Klausel, also müssen Sie einen Code eingeben, um zu unterscheiden, welche Einschränkung beteiligt war. Glücklicherweise ist es möglich. Das einzige, was Sie wissen sollten, ist die Reihenfolge der Zuweisung, und Sie können mehrere Male zuweisen. Angenommen, Sie haben eine eindeutige Einschränkung für a und b, und Sie möchten c nur aktualisieren, wenn eine Eindeutigkeit vorliegt: ... KEY UPDATE c = IF (a = WERTE (a) und b <> WERTE (b), WERTE (c), c), b = WERTE (b)

    Wenn Sie jedoch die Reihenfolge der Zuweisungen ändern, wird die zweite Bedingung in if immer falsch sein.

  3. Siehe 2.