2014-09-04 13 views
52

Tôi đang cố gắng hiểu cách cập nhật nhiều hàng với các giá trị khác nhau và tôi chỉ không nhận được nó. Giải pháp ở khắp mọi nơi nhưng đối với tôi, có vẻ khó hiểu.MySQL - CẬP NHẬT nhiều hàng với các giá trị khác nhau trong một truy vấn

Ví dụ, ba cập nhật vào 1 truy vấn:

UPDATE table_users 
SET cod_user = '622057' 
    , date = '12082014' 
WHERE user_rol = 'student' 
    AND cod_office = '123456'; 

UPDATE table_users 
SET cod_user = '2913659' 
    , date = '12082014' 
WHERE user_rol = 'assistant' 
    AND cod_office = '123456'; 

UPDATE table_users 
SET cod_user = '6160230' 
    , date = '12082014' 
WHERE user_rol = 'admin' 
    AND cod_office = '123456'; 

tôi read một ví dụ, nhưng tôi thực sự không hiểu làm thế nào để thực hiện truy vấn. tức là:

UPDATE table_to_update 
SET cod_user= IF(cod_office = '123456','622057','2913659','6160230') 
    ,date = IF(cod_office = '123456','12082014') 
WHERE ?? IN (??) ; 

Tôi không hoàn toàn rõ ràng cách thực hiện truy vấn nếu có nhiều điều kiện trong WHERE và trong điều kiện IF..tất cả các ý tưởng?

Trả lời

87

Bạn có thể làm theo cách này:

UPDATE table_users 
    SET cod_user = (case when user_role = 'student' then '622057' 
         when user_role = 'assistant' then '2913659' 
         when user_role = 'admin' then '6160230' 
        end), 
     date = '12082014' 
    WHERE user_role in ('student', 'assistant', 'admin') AND 
      cod_office = '17389551'; 

Tôi không hiểu định dạng ngày của bạn. Ngày phải được lưu trữ trong cơ sở dữ liệu bằng cách sử dụng các kiểu ngày tháng và thời gian.

+0

cách tôi có thể thực hiện để cập nhật được thực hiện, nếu bản ghi đã tồn tại – franvergara66

+0

@ franvergara66. . . Tôi không hiểu bình luận của bạn. 'update' s chỉ ảnh hưởng đến các bản ghi đã tồn tại. –

+0

Xin lỗi tiếng anh của tôi thưa bạn, khi tôi cố gắng thực hiện một bản cập nhật mysql cho tôi lỗi: # 1062 - Nhập mục trùng lặp 'XXX' cho khóa 'CHÍNH'. Điều đó xảy ra khi tôi cố gắng cập nhật bản ghi với cùng giá trị mà nó đã có, có cách nào để bỏ qua bản cập nhật nếu giá trị hiện tại giống như đang được cập nhật không? – franvergara66

4

Bạn có thể sử dụng một tuyên bố CASE để xử lý nhiều nếu/sau đó kịch bản:

UPDATE table_to_update 
SET cod_user= CASE WHEN user_rol = 'student' THEN '622057' 
        WHEN user_rol = 'assistant' THEN '2913659' 
        WHEN user_rol = 'admin' THEN '6160230' 
       END 
    ,date = '12082014' 
WHERE user_rol IN ('student','assistant','admin') 
    AND cod_office = '17389551'; 
+1

Bạn đã đánh máy vào cuối câu lệnh CASE: bạn có 2 dấu phẩy bên cạnh nhau. – pmrotule

42

MySQL cho phép một cách dễ đọc hơn để kết hợp nhiều bản cập nhật vào một truy vấn duy nhất. Điều này có vẻ phù hợp hơn với kịch bản mà bạn mô tả, dễ đọc hơn nhiều và tránh những điều kiện khó xử lý này.

INSERT INTO table_users (cod_user, date, user_rol, cod_office) 
VALUES 
('622057', '12082014', 'student', '123456'), 
('2913659', '12082014', 'assistant','123456'), 
('6160230', '12082014', 'admin', '123456') 
ON DUPLICATE KEY UPDATE 
cod_user=VALUES(cod_user), date=VALUES(date) 

Điều này giả định rằng kết hợp user_rol, cod_office là khóa chính. Nếu chỉ một trong số này là PK, thì hãy thêm trường khác vào danh sách UPDATE. Nếu cả hai không phải là khóa chính (có vẻ như không chắc chắn) thì cách tiếp cận này sẽ luôn tạo các bản ghi mới - có thể không phải là những gì được mong muốn.

Tuy nhiên, cách tiếp cận này làm cho các câu lệnh chuẩn bị dễ xây dựng và súc tích hơn.

+2

Cảm ơn bạn!Đây là những gì tôi đã tìm kiếm trong một thời gian dài, cách tìm kiếm sạch nhất, tôi không thể tìm ra cú pháp này, cụ thể là 'cod_user = VALUES (cod_user), ...', thậm chí từ tài liệu chính thức của MySQL 5.6 – user3198882

+10

Lưu ý: Điều này sẽ thêm hàng mới nếu khóa không tồn tại trong bảng dẫn đến các bản ghi không mong muốn. – Faraz

+0

Tricky để sử dụng IODKU không bao giờ chèn, nhưng rất thanh lịch. –

2
update table_name 
set cod_user = 
    CASE 
    WHEN user_rol = 'student' THEN '622057' 
    WHEN user_rol = 'assistant' THEN '2913659' 
    WHEN user_rol = 'admin' THEN '6160230'? 
    END,date = '12082014' 

WHERE user_rol IN ('student','assistant','admin') 
AND cod_office = '17389551'; 
Các vấn đề liên quan