MySQL批量INSERT或UPDATE

rid*_*rid 28 mysql sql bulk

是否有任何方法可以批量执行INSERT OR UPDATEMySQL服务器上的查询?

INSERT IGNORE ...
Run Code Online (Sandbox Code Playgroud)

将无法工作,因为如果该字段已经存在,它将简单地忽略它而不插入任何内容.

REPLACE ...
Run Code Online (Sandbox Code Playgroud)

将不起作用,因为如果该字段已经存在,它将首先DELETE它然后INSERT再次,而不是更新它.

INSERT ... ON DUPLICATE KEY UPDATE
Run Code Online (Sandbox Code Playgroud)

会有效,但不能批量使用.

所以我想知道是否有任何类似的命令INSERT ... ON DUPLICATE KEY UPDATE可以批量发布(同时多行).

use*_*996 71

可以使用INSERT ... ON DUPLICATE KEY UPDATE插入/更新多行.该文档具有以下示例:

INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)
ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
Run Code Online (Sandbox Code Playgroud)

或者我误解了你的问题?

  • 对于阅读此内容的任何人来说,一个更清晰的例子是"INSERT INTO表(a,b,c)值(1,2,3),(4,5,6)在重复键更新a =值(a),b = VALUES (b),c = VALUES(c); `所以这样你可以使用updated_at代替c来更新像updated_at这样的列`VALUES(1,2,NOW())`. (14认同)

Kib*_*bee 18

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

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
Run Code Online (Sandbox Code Playgroud)

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

更新

我交换了插入和更新的顺序,因为首先执行insert会导致在调用更新时更新所有插入的行.如果首先更新,则仅更新现有记录.这应该意味着服务器的工作少一点,尽管结果应该是相同的.