MYSQL – 在一个查询中更新具有不同值的多个行

我想了解如何更新不同值的多行,我只是不明白。 解决scheme无处不在,但对我来说,看起来很难理解。

例如,三个更新到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'; 

我读了一个例子,但我真的不知道如何进行查询。 即:

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

我不完全清楚如何在WHERE和IF条件..任何想法多个条件如何做查询.. ..预先感谢任何帮助。 我真的坚持这一点。

你可以这样做:

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

我不明白你的date格式。 date应该使用本地date和时间types存储在数据库中。

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列表中。 如果他们都不是主键(这似乎不太可能),那么这种方法将总是创造新的logging – 可能不是想要的。

但是,这种方法使得准备好的语句更容易构build,并且更加简洁。

您可以使用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'; 
 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';