sql >> Databáze >  >> RDS >> Mysql

Chování MySQL při ON DUPLICATE KEY UPDATE pro více UNIQUE polí

Zvažte

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

Pokud a a b jsou UNIQUE pole, UPDATE vyskytuje se na a = 1 OR b = 2 . Také když podmínka a = 1 OR b = 2 je splněna dvěma nebo více položkami, aktualizace se provede pouze jednou.

Příklad zde tabulka tabulky s ID a názvem UNIQUE pole

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

Pokud je dotaz

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

pak dostaneme

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

což porušuje jedinečnost Id a Name. Nyní s

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

dostáváme

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

Chování na více klávesách je následující

UPDATE v ON DUPLICATE KEY UPDATE se provede, pokud jeden z UNIQUE pole se rovná hodnotě, která má být vložena. Zde UPDATE se provádí na Id = 1 OR Name = C . Je ekvivalentní k

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

Co když chci pouze jednu aktualizaci pro kterýkoli klíč

Lze použít UPDATE příkaz s LIMIT klíčové slovo

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

který dá

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

Co když chci jednu aktualizaci, pouze pokud se hodnoty pro oba klíče shodují

Jedním z řešení je ALTER TABLE a vytvořte PRIMARY KEY (nebo jedinečnost) práce na obou polích.

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

Nyní, na

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

dostáváme

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

protože nebyl nalezen žádný duplikát (na obou klíčích).



  1. Rozdíl uložené procedury EXEC vs sp_executesql?

  2. Vložení vícerozměrného pole php do databáze mysql

  3. Jak a kdy správně používat SLEEP() v MySQL?

  4. Jak se připojit k databázi Cloud SQL MySQL z App Engine?