2013-05-04 9 views
16

z MySQL 4.1.0 roku, możliwe jest dodanie ON DUPLICATE KEY UPDATE oświadczenie określić zachowanie, gdy wartości włożona (z INSERT lub SET lub VALUES) są już w docelowym tabeli w.r.t. PRIMARY KEY lub niektóre pole UNIQUE. Jeśli wartość dla PRIMARY KEY lub niektóre pole UNIQUE jest już w tabeli, INSERT zostaje zastąpione przez UPDATE.MySQL zachowanie ON duplikat KEY UPDATE dla wielu dziedzin UNIKALNYCH

  • Jak ON DUPLICATE KEY UPDATE zachowywać w przypadku istnieje wiele UNIQUE pola w moim stole?

  • Czy mogę mieć tylko jedną aktualizację, jeśli pole UNIQUE jest dopasowane?

  • Czy mogę uzyskać aktualizację tylko wtedy, gdy oba pola UNIQUE są dopasowane jednocześnie?

Odpowiedz

20

Rozważmy

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

jeśli aib są UNIQUE pola, UPDATE występuje na a = 1 OR b = 2. Również gdy warunek a = 1 OR b = 2 jest spełniony przez dwie lub więcej pozycji, aktualizacja jest wykonywana tylko raz.

Ex tutaj stół z Identyfikator i nazwisko UNIQUE pól

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

Jeśli zapytanie jest

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

wtedy otrzymujemy

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

które naruszają wyjątkowość Identyfikator i nazwisko. Teraz z

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

otrzymujemy

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

Zachowanie na wielu klawiszy jest następujące

UPDATE w ON DUPLICATE KEY UPDATE przeprowadza się, jeżeli jeden z pola UNIQUE równa wartości do wstawienia. Tutaj UPDATE jest wykonywane na Id = 1 OR Name = C.Jest to odpowiednik

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

Co jeśli chcę jedną aktualizację tylko dla zarówno klucz

można użyć UPDATE oświadczenie z LIMIT hasła

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

które dadzą

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

Co jeśli chcę jedną aktualizację tylko wtedy, gdy wartości dla obu klawiszy są dopasowane

Jednym z rozwiązań jest ALTER TABLE i uczynić PRIMARY KEY (lub wyjątkowość) działa na obu polach.

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

Teraz na

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

otrzymujemy

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

ponieważ bez dwóch egzemplarzach (po obu klawiszy) została znaleziona.

+1

Jeśli masz tabelę z dwoma kolumnami jako klucz podstawowy, a chcą pracować z ON duplikat KEY, należy unikać dodać unikatowy indeks na kolumnie PK, ponieważ jeśli będzie aktualizować pk1 lub pk2 są obecne w wartościach. – jloria

+2

Czy istnieje sposób na unikalne ograniczenie w drugiej kolumnie, ale czy ma to wpływ na tę duplikat operacji aktualizacji klucza? Oznacza to, że wstawienie lub aktualizacja zakończy się niepowodzeniem, jeśli nie zostanie spełnione ograniczenie unikalności. – CMCDragonkai

0
  1. jaki sposób MySQL zachowywać ... zachowuje się zgodnie z oczekiwaniami, czyli wykonuje ON duplikat KEY klauzuli.

  2. mogę mieć jedną aktualizację dla obu ... W rzeczywistości, masz tylko jeden ON duplikat KEY klauzuli, więc trzeba umieścić jakiś kod, aby odróżnić, które ograniczeniem był zaangażowany. Na szczęście jest to możliwe. Jedyne, co powinieneś wiedzieć, kolejność przydziału jest ważna i możesz przypisać wiele razy. Załóżmy, że masz wyjątkowe ograniczenie dla aib, i chcesz zaktualizować c tylko wtedy, gdy bierze się pod uwagę wyjątkowość: ... KEY UPDATE c = JEŻELI (a = WARTOŚCI (a) i b <> WARTOŚCI (b), WARTOŚCI (c), c), b = WARTOŚCI (b)

    , ale jeśli zmienisz kolejność przypisań, drugi warunek w obrębie, jeśli będzie zawsze fałszywy.

  3. Patrz 2.