Cập nhật nhiều hàng với các giá trị khác nhau trong một truy vấn


12

Tôi đang cố gắng hiểu làm thế nào để CẬP NHẬT nhiều hàng với các giá trị khác nhau và tôi không nhận được nó. Giải pháp ở khắp mọi nơi nhưng với tôi có vẻ khó hiểu.

Chẳng hạn, hai bản cập nhật thành 1 truy vấn:

UPDATE mytable SET fruit='orange', drink='water', food='pizza' WHERE id=1;

UPDATE mytable SET fruit='strawberry', drink='wine', food='fish' WHERE id=2;

Tôi không hiểu CASE KHI NÀO .. THÌ ... END hoạt động và cách sử dụng nó.

Tự hỏi nếu ai đó có thể giúp tôi về điều này.

Câu trả lời:


11
UPDATE mytable SET
    fruit = CASE WHEN id=1 THEN 'orange' ELSE 'strawberry' END,
    drink = CASE WHEN id=1 THEN 'water'  ELSE 'wine'       END,
    food  = CASE WHEN id=1 THEN 'pizza'  ELSE 'fish'       END
WHERE id IN (1,2);

Cá nhân, sử dụng CASE WHEN THEN ENDtrông vụng về.

Bạn có thể mã này bằng hàm IF .

UPDATE mytable SET
    fruit = IF(id=1,'orange','strawberry'),
    drink = IF(id=1,'water','wine'),
    food  = IF(id=1,'pizza','fish')
WHERE id IN (1,2);

Hãy thử một lần !!!

CAVEAT: CASE WHEN THEN ENDchỉ tiện dụng khi xử lý nhiều giá trị (hơn 2)


Thật tuyệt, tôi không biết về chức năng IF này. Bạn có thể giải thích: = IF (id = 1, Tại sao bạn cần cái này không?
user3162468

4
Tôi có thể sử dụng điều này để cập nhật khoảng 100 nghìn hồ sơ trong truy vấn tội lỗi không?
AMB

4

INSERT ... ON DUPLICATE KEY UPDATE

Bạn sẽ cần phải viết các điều kiện rất phức tạp nếu bạn muốn cập nhật nhiều hơn hai hàng. Trong trường hợp như vậy bạn có thể sử dụng INSERT ... ON DUPLICATE KEY UPDATEphương pháp tiếp cận.

INSERT into `mytable` (id, fruit, drink, food)
VALUES
    (1, 'orange', 'water', 'pizza'),
    (2, 'strawberry', 'wine', 'fish'),
    (3, 'peach', 'jiuce', 'cake')
ON DUPLICATE KEY UPDATE
    fruit = VALUES(fruit), 
    drink = VALUES(drink), 
    food = VALUES(food);

3
Lưu ý rằng điều này làm tăng giá trị tự động cho bảng, nếu bạn đang sử dụng tính năng tự động. Đối với các bảng thông lượng cao có thể là không mong muốn. Thêm thông tin stackoverflow.com/a/23517191/2560641
Juliano
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.