Considera
INSERT INTO table (a,b,c) VALUES (1,2,3)
-> ON DUPLICATE KEY UPDATE c=c+1;
Se aeb sono UNIQUE
campi, UPDATE
si verifica su a = 1 OR b = 2
. Anche quando la condizione a = 1 OR b = 2
incontra due o più voci, l'aggiornamento viene eseguito una sola volta.
Ex qui tabella tabella con Id e Nome UNIQUE
campi
Id Name Value
1 P 2
2 C 3
3 D 29
4 A 6
Se la query è
INSERT INTO table (Id, Name, Value)
VALUES (1, C, 7);
quindi otteniamo
Id Name Value
1 P 2
2 C 3
3 D 29
4 A 6
1 C 7
che viola l'unicità di Id e Name. Ora con
INSERT INTO table (Id, Name, Value)
VALUES (1, C, 7)
ON DUPLICATE KEY UPDATE Value = 7;
otteniamo
Id Name Value
1 P 7
2 C 7
3 D 29
4 A 6
Il comportamento su più tasti è il seguente
UPDATE
in ON DUPLICATE KEY UPDATE
viene eseguito se uno dei UNIQUE
campo è uguale al valore da inserire. Qui, UPDATE
viene eseguito su Id = 1 OR Name = C
. È equivalente a
UPDATE table
SET Value = 7
WHERE Id = 1 OR Name = C;
E se volessi un solo aggiornamento, per una delle chiavi
Può usare UPDATE
istruzione con LIMIT
parola chiave
UPDATE table
SET Value = 7
WHERE Id = 1 OR Name = C
LIMIT 1;
che darà
Id Name Value
1 P 7
2 C 3
3 D 29
4 A 6
E se volessi un aggiornamento solo se i valori di entrambe le chiavi sono abbinati
Una soluzione è ALTER TABLE
e crea la PRIMARY KEY
(o unicità) funzionano su entrambi i campi.
ALTER TABLE table
DROP PRIMARY KEY,
ADD PRIMARY KEY (Id, Name);
Ora, su
INSERT INTO table (Id, Name, Value)
VALUES (1, C, 7)
ON DUPLICATE KEY UPDATE Value = 7;
otteniamo
Id Name Value
1 P 2
2 C 3
3 D 29
4 A 6
1 C 7
poiché non è stato trovato alcun duplicato (su entrambe le chiavi).