sql >> Databasteknik >  >> RDS >> Mysql

MySQL-beteende för PÅ DUBLIKATNYCKELUPPDATERING för flera UNIKA fält

Överväg

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

Om a och b är UNIQUE fält, UPDATE förekommer på a = 1 OR b = 2 . Även när villkoret a = 1 OR b = 2 uppfylls av två eller flera poster, uppdatering görs endast en gång.

Ex här tabelltabell med Id och Namn UNIQUE fält

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

Om frågan är

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

då får vi

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

som bryter mot unika ID och namn. Nu med

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

vi får

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

Beteende på flera nycklar är följande

UPDATE i ON DUPLICATE KEY UPDATE utförs om någon av UNIQUE fältet är lika med värdet som ska infogas. Här, UPDATE utförs på Id = 1 OR Name = C . Det motsvarar

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

Vad händer om jag bara vill ha en uppdatering, för någon av tangenterna

Kan använda UPDATE uttalande med LIMIT sökord

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

som kommer att ge

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

Vad händer om jag bara vill ha en uppdatering om värdena för båda nycklarna matchas

En lösning är att ALTER TABLE och gör PRIMARY KEY (eller unika) arbete på båda områdena.

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

Nu, på

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

vi får

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

eftersom ingen dubblett (på båda nycklarna) hittas.



  1. RMAN misslyckas med RMAN-06900 RMAN-06901 ORA-04031

  2. Hur sammanfogar man datatyper som heltal (heltal med heltal) &varchar (varchar med varchar) i mysql?

  3. Konvertera 'tid' till 'datetime2' i SQL Server (T-SQL-exempel)

  4. R12.2 Rapport om beredskap för onlinepatchning