首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL大容量插入或更新

问MySQL大容量插入或更新
EN

Stack Overflow用户
提问于 2011-06-09 07:24:23
回答 5查看 61.8K关注 0票数 33

有没有办法在MySQL服务器上批量执行像INSERT OR UPDATE这样的查询?

代码语言:javascript
复制
INSERT IGNORE ...

将不起作用,因为如果该字段已经存在,它将简单地忽略它并且不插入任何内容。

代码语言:javascript
复制
REPLACE ...

将不起作用,因为如果字段已经存在,它将首先对其执行DELETE操作,然后再次对其执行INSERT操作,而不是更新它。

代码语言:javascript
复制
INSERT ... ON DUPLICATE KEY UPDATE

将会起作用,但不能批量使用。

所以我想知道是否有像INSERT ... ON DUPLICATE KEY UPDATE这样的命令可以批量发出(同时多行)。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-08-10 04:14:25

您可以使用INSERT ...插入/更新多行。在重复密钥更新时。documentation具有以下示例:

代码语言:javascript
复制
INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)
ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);

还是我误解了你的问题?

票数 78
EN

Stack Overflow用户

发布于 2011-06-09 07:47:15

一种可能的方法是创建一个临时表,将数据插入其中,然后使用连接执行一次查询,以插入不存在的记录,然后更新到存在的字段。基本情况是这样的。

代码语言:javascript
复制
CREATE TABLE MyTable_Temp LIKE MyTable

LOAD DATA INFILE..... INTO MyTable_Temp

UPDATE MyTable INNER JOIN 
MyTable_Temp
ON MyTable.ID=MyTable_Temp.ID
SET MyTable.Col1=MyTable_Temp.Col1, MyTable.Col2=MyTable_Temp.Col2.....

INSERT INTO MyTable(ID,Col1,Col2,...)
SELECT ID,Col1,Col2,... 
FROM MyTable_Temp
LEFT JOIN MyTable 
ON MyTable_Temp.ID = MyTable.ID
WHERE myTable.ID IS NULL

DROP TABLE MyTable_Temp

语法可能并不准确,但这应该能为您提供基础知识。此外,我知道它不是很漂亮,但它可以完成工作。

更新

我交换了insert和update的顺序,因为执行insert first会在调用update时更新所有插入的行。如果先更新,则只更新现有记录。这应该意味着减少服务器的工作量,尽管结果应该是相同的。

票数 19
EN

Stack Overflow用户

发布于 2014-02-11 10:11:03

尽管这个问题已经得到了正确的回答( MySQL确实通过使用预期的多值集语法在复制更新时支持这个问题),但我想通过提供一个任何使用MySQL的人都可以运行的演示来扩展这个问题:

代码语言:javascript
复制
CREATE SCHEMA IF NOT EXISTS `test`;
DROP TABLE IF EXISTS test.new_table;
CREATE TABLE test.new_table (`Key` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`Key`)) ENGINE=InnoDB AUTO_INCREMENT=106 DEFAULT CHARSET=utf8;

SELECT * FROM test.new_table;
INSERT INTO test.new_table VALUES (1),(2),(3),(4),(5) ON DUPLICATE KEY UPDATE `Key`=`Key`+100;
SELECT * FROM test.new_table;
INSERT INTO test.new_table VALUES (1),(2),(3),(4),(5) ON DUPLICATE KEY UPDATE `Key`=`Key`+100;
SELECT * FROM test.new_table;

输出如下:

代码语言:javascript
复制
Empty set (0.00 sec)

Query OK, 5 rows affected (0.00 sec)
Records: 5  Duplicates: 0  Warnings: 0

+-----+
| Key |
+-----+
|   1 |
|   2 |
|   3 |
|   4 |
|   5 |
+-----+
5 rows in set (0.00 sec)

Query OK, 10 rows affected (0.00 sec)
Records: 5  Duplicates: 5  Warnings: 0

+-----+
| Key |
+-----+
| 101 |
| 102 |
| 103 |
| 104 |
| 105 |
+-----+
5 rows in set (0.00 sec)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6286452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档