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

MySQL-adfærd for ON DUPLICATE KEY UPDATE for flere UNIKKE felter

Overvej

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

Hvis a og b er UNIQUE felter, UPDATE forekommer på a = 1 OR b = 2 . Også når betingelse a = 1 OR b = 2 er opfyldt af to eller flere poster, opdateres kun én gang.

Eks her tabeltabel med id og navn UNIQUE felter

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

Hvis forespørgslen er

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

så får vi

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

som krænker entydigheden af ​​id og navn. 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

Adfærd på flere taster er følgende

UPDATE i ON DUPLICATE KEY UPDATE udføres, hvis en af ​​UNIQUE felt er lig med den værdi, der skal indsættes. Her UPDATE udføres på Id = 1 OR Name = C . Det svarer til

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

Hvad nu hvis jeg kun vil have én opdatering, for begge nøgler

Kan bruge UPDATE sætning med LIMIT søgeord

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

som vil give

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

Hvad hvis jeg kun vil have én opdatering, hvis værdierne for begge nøgler matches

En løsning er at ALTER TABLE og lav PRIMARY KEY (eller unikke) arbejde på begge områder.

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

Nu videre

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

da der ikke findes nogen duplikat (på begge nøgler).



  1. SQL Server Temporary Object Caching

  2. Kan jeg genbruge et beregnet felt i en SELECT-forespørgsel?

  3. SQL-serverunion, men hold orden

  4. virtualenv(python3.4), pip install mysqlclient fejl