Mysql
 sql >> Database >  >> RDS >> Mysql

Comportamento MySQL di ON DUPLICATE KEY UPDATE per più campi UNIQUE

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).