sql >> Database >  >> RDS >> Mysql

MySQL-gedrag van ON DUPLICATE KEY UPDATE voor meerdere UNIEKE velden

Overweeg

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

Als a en b UNIQUE zijn velden, UPDATE komt voor op a = 1 OR b = 2 . Ook wanneer voorwaarde a = 1 OR b = 2 wordt voldaan door twee of meer vermeldingen, wordt de update slechts één keer uitgevoerd.

Ex hier tabel tabel met ID en naam UNIQUE velden

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

Als de vraag is

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

dan krijgen we

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

die de uniciteit van ID en naam schendt. Nu met

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

we krijgen

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

Het gedrag op meerdere toetsen is het volgende

UPDATE in ON DUPLICATE KEY UPDATE wordt uitgevoerd als een van de UNIQUE veld gelijk is aan de in te voegen waarde. Hier, UPDATE wordt uitgevoerd op Id = 1 OR Name = C . Het is gelijk aan

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

Wat als ik slechts één update wil, voor beide sleutels

Kan UPDATE gebruiken statement met LIMIT zoekwoord

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

wat zal geven

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

Wat als ik slechts één update wil als de waarden voor beide sleutels overeenkomen

Een oplossing is om ALTER TABLE en maak de PRIMARY KEY (of uniciteit) werken op beide velden.

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

Nu, op

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

we krijgen

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

aangezien er geen duplicaat (op beide sleutels) is gevonden.



  1. PostgreSQL automatisch verhogen

  2. Kan geen verbinding maken met MySQL 4.1+ met oude authenticatie

  3. SQL-queryconstructie - scheid gegevens in een kolom in twee kolommen

  4. Hoe maak ik back-ups in MySQL?