2014-09-04 67 views
52

我想了解如何更新具有不同值的多行,而我只是不明白它。解決方案無處不在,但對我來說,看起來很難理解。MySQL - 在一個查詢中更新具有不同值的多行

例如,三次更新到1個查詢:

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'; 

read一個例子,但是我真的不知道如何使查詢。即:

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

我不完全清楚如何做的查詢如果有多個條件在WHERE和IF條件..任何想法?

回答

87

你可以這樣來做:

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'; 

我不明白你的日期格式。日期應該使用本地日期和時間類型存儲在數據庫中。

+0

我該怎麼做才能執行更新,如果記錄已經存在 – franvergara66 2014-09-07 02:21:05

+0

@ franvergara66。 。 。我不明白你的評論。 'update's隻影響已經存在的記錄。 – 2014-09-07 02:47:31

+0

打擾我的英語先生,當我嘗試進行更新MySQL給我的錯誤:#1062 - 重複項'XXX'爲'PRIMARY'鍵。當我嘗試用已有的相同值更新記錄時,如果當前值與正在更新的值相同,是否有任何方法可以跳過更新? – franvergara66 2014-09-07 03:03:37

4

您可以使用CASE語句來處理多的if/then場景:

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

您在CASE聲明結尾處犯了錯字:您有兩個逗號彼此相鄰。 – pmrotule 2015-04-14 01:45:07

42

MySQL允許一個更可讀的方式將多個更新合併成一個單一的查詢。這似乎更適合你描述的場景,更容易閱讀,並且避免了那些難以解決多種情況的難題。

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) 

這裏假定user_rol, cod_office組合是主鍵。如果其中只有一個是PK,則將其他字段添加到UPDATE列表中。 如果它們都不是主鍵(這似乎不太可能),那麼這種方法將始終創建新的記錄 - 可能不是想要的。

但是,這種方法使準備好的語句更易於構建並且更加簡潔。

+2

謝謝!這是我搜索很長時間,最清晰的方式,我無法弄清楚這個語法,特別是'cod_user = VALUES(cod_user),...',甚至來自官方的MySQL 5.6文檔 – user3198882 2016-07-06 12:36:56

+10

注意:這將是如果表中不存在密鑰導致不需要的記錄,請添加新行。 – Faraz 2016-07-17 07:53:31

+0

棘手使用永不插入IODKU,但非常優雅。 – 2017-06-06 18:23:31

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'; 
相關問題