![]() |
1
581
是的,这是可能的-您可以使用insert…在重复的密钥更新时。 使用您的示例:
|
![]() |
2
111
因为您有动态值,所以需要使用if或case来更新列。它变得有点难看,但它应该起作用。 使用您的示例,您可以这样做: UPDATE table SET Col1 = CASE id WHEN 1 THEN 1 WHEN 2 THEN 2 WHEN 4 THEN 10 ELSE Col1 END, Col2 = CASE id WHEN 3 THEN 3 WHEN 4 THEN 12 ELSE Col2 END WHERE id IN (1, 2, 3, 4); |
![]() |
3
82
这个问题由来已久,但我想用另一个答案来扩展这个话题。
我的观点是,实现这一点的最简单方法就是用一个事务包装多个查询。公认的答案
我为三个建议的变体做了一些性能测试,包括
编辑: 调查结果 Dakusan 证明我的绩效评估不是很有效。请看 this answer 另一个更为详尽的研究。 |
![]() |
4
52
不知道为什么还没有提到另一个有用的选项:
|
![]() |
5
29
以下所有内容均适用于InnoDB。 我觉得知道三种不同方法的速度很重要。 有三种方法:
我刚测试过这个,插入方法是 6.7X 比事务处理方法更快。我试了一套3000行和30000行。 Transaction方法仍然必须运行每个单独的查询,这需要时间,尽管它在执行时将结果批处理到内存或其他地方。事务方法在复制日志和查询日志中也非常昂贵。 更糟糕的是,案例方法是 41.1X 低于插入方法w/30000条记录(比事务慢6.1X)。和 75倍 在Myisam中更慢。插入和事例方法甚至在大约1000条记录中打破了平衡。即使是在100条记录下,case方法也快不了多少。 所以总的来说,我觉得insert方法是最好的,也是最容易使用的。查询更小,更容易阅读,只需要1个动作查询。这适用于InnoDB和MyISAM。 奖金:
解决插入非默认字段问题的方法是暂时关闭相关的SQL模式:
至于其他的评论,我已经看到说使用insert方法自动增加了,我也测试过了,但似乎不是这样。 运行测试的代码如下。它还输出.sql文件以消除PHP解释器开销
|
![]() |
6
8
这应该对你有用。 中有一个引用 the MySQL manual 对于多个表。 |
![]() |
7
8
使用临时表
|
![]() |
8
3
您可以对同一个表进行别名,以提供要插入的ID(如果正在逐行更新:
此外,显然您也可以从其他表中进行更新。在这种情况下,更新将加倍为“select”语句,为您提供指定表中的数据。您在查询中显式地声明了更新值,因此第二个表不受影响。 |
![]() |
9
2
您也可能对在更新时使用联接感兴趣,这也是可能的。
编辑:如果要更新的值不是来自数据库中的其他地方,则需要发出多个更新查询。 |
![]() |
10
2
您可以更改一个名为“multi-statement”的设置,该设置禁用MySQL实现的“安全机制”,以防止(多个)注入命令。对于MySQL的“出色”实现来说,它也会阻止用户进行有效的查询。 此处( http://dev.mysql.com/doc/refman/5.1/en/mysql-set-server-option.html )是关于设置的C实现的一些信息。 如果您使用的是php,那么可以使用mysqli来执行多语句(我认为php已经随mysqli提供了一段时间了)
希望有帮助。 |
![]() |
11
2
为什么没人提到 一个查询中有多个语句 ?
在PHP中,您使用
这是与更新30000 raw中其他3种方法的比较结果。可以找到代码 here 基于@dakusan的回答
交易:5.5194580554962
如您所见,多语句查询比最高答案更有效。 如果您收到这样的错误消息:
您可能需要增加
|
![]() |
12
-1
使用
请注意:
|
![]() |
13
-3
下面将更新一个表中的所有行
下一个将更新列2的值大于5的所有行
有一切 Unkwntech 更新多个表的示例
|
![]() |
14
-3
是..可以在重复的key update sql语句上使用insert.. 语法: 插入到表\名称(A,B,C)值(1,2,3),(4,5,6) 在重复键更新时,A=值(A),B=值(B),C=值(C) |
![]() |
15
-4
用PHP我做到了。使用分号,将其拆分为数组,然后通过循环提交。
|
![]() |
16
-5
这应该达到你想要的。只需添加更多的ID。我已经测试过了。 |
![]() |
17
-7
//你只是用类似php的语言构建它
因此,可以使用一个查询更新孔表 |
![]() |
Community wiki · SQL语法新手 1 年前 |
![]() |
KateMak · 是否将多行中的多列与唯一id组合? 1 年前 |
![]() |
Karuna · SQL中列内的筛选器[重复] 1 年前 |
![]() |
Irvan Affandy · 为另一个选择选择声明的键 1 年前 |
![]() |
Community wiki · 这个MySQL语句出了什么问题? 1 年前 |
![]() |
Community wiki · 优化从同一表中提取的多列的查询 1 年前 |