有没有办法在MySQL服务器上批量执行像INSERT OR UPDATE这样的查询?
INSERT IGNORE ...将不起作用,因为如果该字段已经存在,它将简单地忽略它并且不插入任何内容。
REPLACE ...将不起作用,因为如果字段已经存在,它将首先对其执行DELETE操作,然后再次对其执行INSERT操作,而不是更新它。
INSERT ... ON DUPLICATE KEY UPDATE将会起作用,但不能批量使用。
所以我想知道是否有像INSERT ... ON DUPLICATE KEY UPDATE这样的命令可以批量发出(同时多行)。
发布于 2011-08-10 04:14:25
您可以使用INSERT ...插入/更新多行。在重复密钥更新时。documentation具有以下示例:
INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)
ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);还是我误解了你的问题?
发布于 2011-06-09 07:47:15
一种可能的方法是创建一个临时表,将数据插入其中,然后使用连接执行一次查询,以插入不存在的记录,然后更新到存在的字段。基本情况是这样的。
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时更新所有插入的行。如果先更新,则只更新现有记录。这应该意味着减少服务器的工作量,尽管结果应该是相同的。
发布于 2014-02-11 10:11:03
尽管这个问题已经得到了正确的回答( MySQL确实通过使用预期的多值集语法在复制更新时支持这个问题),但我想通过提供一个任何使用MySQL的人都可以运行的演示来扩展这个问题:
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;输出如下:
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)https://stackoverflow.com/questions/6286452
复制相似问题