Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Zachowanie MySQL z ON DUPLICATE KEY UPDATE dla wielu unikalnych pól

Rozważ

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

Jeśli a i b są UNIQUE pola, UPDATE występuje na a = 1 OR b = 2 . Również wtedy, gdy warunek a = 1 OR b = 2 zostanie spełniony przez dwa lub więcej wpisów, aktualizacja jest wykonywana tylko raz.

Np. tabela tabeli z identyfikatorem i nazwą UNIQUE pola

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

Jeśli zapytanie to

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

wtedy dostajemy

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

co narusza unikalność identyfikatora i nazwy. Teraz z

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

otrzymujemy

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

Zachowanie na wielu klawiszach jest następujące

UPDATE w ON DUPLICATE KEY UPDATE jest wykonywany, jeśli jeden z UNIQUE pole jest równe wartości do wstawienia. Tutaj UPDATE jest wykonywany na Id = 1 OR Name = C . Jest to odpowiednik

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

A jeśli chcę tylko jednej aktualizacji dla każdego klucza

Może użyć UPDATE oświadczenie z LIMIT słowo kluczowe

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

co da

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

Co zrobić, jeśli chcę tylko jednej aktualizacji, jeśli wartości obu kluczy są zgodne

Jednym z rozwiązań jest ALTER TABLE i utwórz PRIMARY KEY (lub unikatowość) działają na obu polach.

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

Teraz w dniu

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

otrzymujemy

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

ponieważ nie znaleziono duplikatu (na obu klawiszach).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dlaczego mój cfloop zatrzymuje się po wstawieniu pierwszego identyfikatora?

  2. Jak ograniczyć próby logowania - PHP i MySQL i CodeIgniter

  3. Jak zachować zamówienie za pomocą SELECT WHERE IN()?

  4. Czy istnieje odpowiednik MySQL preg_replace PHP?

  5. Czy istnieje limit pamięci dla metody json_encode()?