2016-12-12 79 views
0

我查看了我找到的所有相关问题,但找不到会回答我的问题。Mysql在一个查询中更新多列的一列

我有一个表是这样的:

id | name | age | active | ...... | ... | 

其中“ID”是一个主键,...这意味着有像30列。 “活动”列是tinyint类型。

我的任务:

更新ID 1,4,12,55,111(那些只是一个例子,它可以在总共1000不同内径),用活性= 1在单个查询。

我所做的:

UPDATE table SET active = 1 WHERE id IN (1,4,12,55,111) 
  • 其在事务内,因为我更新在这个过程中别的东西。

  • 引擎是InnoDB的


我的问题:

有人告诉我,做这样的查询等效于在执行5个查询,引起IN将转换为一个给定数量的OR,并逐个运行它们。

最终,而不是1我得到N这是IN中的数字。

他建议创建一个临时表,在其中插入所有新值,然后通过连接进行更新。

他对吗?兼顾和表现。


你有什么建议?我以为INSERT INTO ..在DUPLICATE UPDATE将有所帮助,但我没有所有的数据的行,只有它的ID,并且我想设置活动= 1。

也许这个查询较好?

UPDATE table SET 
active = CASE 
WHEN id='1' THEN '1' 
WHEN id='4' THEN '1' 
WHEN id='12' THEN '1' 
WHEN id='55' THEN '1' 
WHEN id='111' THEN '1' 
ELSE active END 
WHERE campaign_id > 0; //otherwise it throws an error about updating without where clause in safe mode, and i don't know if i could toggle safe mode off. 

谢谢。

+0

是的,他是正确的或使用存在。 Update table set active = 1 where Exists(从table2中选择1,其中...) –

回答

0

我觉得下面比较好,因为它使用主键。

UPDATE table SET active = 1 WHERE id<=5 
+0

1-5仅仅是一个例子,id可以是任何一组数字,例如:(1,10,23,44,51),我会编辑问题,这样会更清楚 – user2212726

1

这是相反的方式。 OR有时可以变成IN。然后有效地执行IN,特别是如果列上有索引。如果您在IN中有1000个条目,它将根据id对该表执行1000次探测。

如果您运行的是足够新的MySQL版本,我认为您可以使用EXPLAIN EXTENDED UPDATE ...OR...; SHOW WARNINGS;来查看此转换;

UPDATE CASE...可能会冗长地检查每一行。

如果您将UPDATE分成多个UPDATEs(每个具有100-1000行),则对系统的其他用户可能会更好。 More on chunking

你从哪里得到ID?如果它是通过SELECT,那么将它与UPDATE结合起来可能是一步而不是两步。

相关问题