2010-10-07 20 views
5

Mam tę tabelę w mojej bazie danych MySQL, "użytkownicy". Ma pola "id" i "wartość".Aktualizacja wielu wierszy o różnych wartościach

Teraz chcę zaktualizować wiele wierszy w tabeli z kwerendy SQL pojedynczy, ale wiele wierszy powinien dostać inną wartość. Obecnie używam tego:

UPDATE users 
    SET value = CASE id 
     WHEN 1 THEN 53 
     WHEN 2 THEN 65 
     WHEN 3 THEN 47 
     WHEN 4 THEN 53 
     WHEN 5 THEN 47 
    END 
WHERE id IN (1,2,3,4,5) 

To działa. Ale czuję, że mógłbym dokonać jakiejś optymalizacji, ponieważ istnieje tylko około 3 lub 4 różne wartości, które przypisuję do wierszy. Jak widać, obecnie są to 47, 53 i 65. Czy istnieje sposób, aby zaktualizować wszystkie wiersze, które otrzymują tę samą wartość jednocześnie w ramach tego samego zapytania? Czy istnieje inny sposób, w jaki mogę to zoptymalizować?

+2

Mogłeś przechowywać mapowanie w osobnej tabeli i dołączyć do to. – Pointy

+1

@Pointy: dlaczego nie umieścić tego jako odpowiedź? – Benoit

+0

@Benoit, ponieważ podczas gdy znam SQL, nie znam MySQL i dlatego nie byłbym w stanie zbudować poprawnego przykładu. – Pointy

Odpowiedz

10

Zamiast robić case variable when value then ..., spróbuj robić case when condition then ... - tak:

UPDATE users 
    SET value = CASE 
     WHEN id in (1,4) THEN 53 
     WHEN id = 2 THEN 65 
     WHEN id in (3,5) THEN 47 
    END 
WHERE id IN (1,2,3,4,5) 
1

Po prostu zrobiłbym to za pomocą kilku różnych instrukcji UPDATE.

UPDATE users 
    SET value = 53 
WHERE id = 1; 


UPDATE users 
    SET value = 65 
WHERE id = 2; 

... 

Wydaje się to najprostsze, jeśli masz tylko 5 lub 6 wartości do ustawienia na wielu wierszach. Czy jest jakiś konkretny powód, który musisz zrobić w jednym zapytaniu?

8

Zakładając id jest unikatowy lub podstawowym ...

insert into users 
    (id,value) 
VALUES 
    (1,53),(2,65),(3,47),(4,53),(5,47) 
on duplicate key update 
value=VALUES(value) 
+0

Nie wiem, dlaczego tak mało głosów. Jest idealny! – Matmarbon

Powiązane problemy