MySQL 批量插入或更新
有什么方法可以在 MySQL 服务器上批量执行诸如 INSERT OR UPDATE 之类的查询吗?
INSERT IGNORE ...
不起作用,因为如果该字段已经存在,它将简单地忽略它并且不插入任何内容。
REPLACE ...
不起作用,因为如果该字段已经存在,它将首先DELETE
它,然后再次INSERT
它,而不是更新它。
INSERT ... ON DUPLICATE KEY UPDATE
可以,但不能批量使用。
所以我想知道是否有像 INSERT ... ON DUPLICATE KEY UPDATE 之类的命令可以批量发出(同时超过一行)。
Is there any way of performing in bulk a query like INSERT OR UPDATE
on the MySQL server?
INSERT IGNORE ...
won't work, because if the field already exists, it will simply ignore it and not insert anything.
REPLACE ...
won't work, because if the field already exists, it will first DELETE
it and then INSERT
it again, rather than updating it.
INSERT ... ON DUPLICATE KEY UPDATE
will work, but it can't be used in bulk.
So I'd like to know if there's any command like INSERT ... ON DUPLICATE KEY UPDATE
that can be issued in bulk (more than one row at the same time).
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
您可以使用 INSERT ... ON DUPLICATE KEY UPDATE 插入/更新多行。 文档具有以下示例:
或者我误解了您的问题?
You can insert/update multiple rows using INSERT ... ON DUPLICATE KEY UPDATE. The documentation has the following example:
Or am I misunderstanding your question?
一种可能的方法是创建一个临时表,将数据插入其中,然后使用联接执行 1 个查询以插入不存在的记录,然后更新到存在的字段。基本原理是这样的。
语法可能不准确,但这应该为您提供基础知识。另外,我知道这并不漂亮,但它可以完成工作。
更新
我交换了插入和更新的顺序,因为先插入会导致调用更新时更新所有插入的行。如果您先更新,则仅更新现有记录。这应该意味着服务器的工作量会减少一些,尽管结果应该是相同的。
One possible way to do this is to create a temporary table, insert the data into that, and then do 1 query with a join to insert the records that don't exist followed by and update to the fields that do exist. The basics would be something like this.
The syntax may not be exact, but this should give you the basics. Also, I know it's not pretty, but it gets the job done.
Update
I swapped the order of the insert and update, because doing insert first causes all the inserted rows to be updated when the update is called. If you do update first, only the existing records are updated. This should mean a little less work for the server, although the results should be the same.
虽然这个问题已经得到了正确的回答(MySQL 确实通过 ON DUPLICATE UPDATE 和预期的多值集语法支持这个问题),但我想通过提供任何使用 MySQL 的人都可以运行的演示来扩展这个问题:
输出如下如下:
Although this question has been answered correctly already (that MySQL does support this via ON DUPLICATE UPDATE with the expected multiple value set syntax), I'd like to expand on this by providing a demonstration that anyone with MySQL can run:
The output is as follows:
尝试添加一个插入触发器,该触发器执行飞行前检查并取消重复键上的插入(更新现有行后)。
不确定它是否能很好地扩展批量插入,更不用说加载数据文件了,但这是我能想到的最好的。 :-)
Try adding an insert trigger that does a pre-flight check and cancels the insert on duplicate key (after updating the existing row).
Not sure it'll scale well for bulk inserts, let alone work for load data infile, but it's the best I can think of. :-)
如果您使用的是 Oracle 或 Microsoft SQL,则可以使用
MERGE
。然而,MySQL 与该语句没有直接关联。您提到了单行解决方案,但正如您所指出的,它的批量处理效果不佳。这是我发现的一篇博客文章,介绍了 Oracle 和 MySQL 之间的差异以及如何在 MySQL 中使用MERGE
执行 Oracle 的操作:http://blog.mclaughlinsoftware.com/2009/05/25/mysql-merge-gone-awry/
这不是一个漂亮的解决方案,而且可能没有那么完整您想要的解决方案,但我相信这是最好的解决方案。
If you were using Oracle or Microsoft SQL, you could use the
MERGE
. However, MySQL does not have a direct correlation to that statement. There is the single-row solution that you mentioned but, as you pointed out, it doesn't do bulk very well. Here is a blog post I found on the difference between Oracle and MySQL and how to do what Oracle does withMERGE
in MySQL:http://blog.mclaughlinsoftware.com/2009/05/25/mysql-merge-gone-awry/
It isn't a pretty solution and it probably isn't as full a solution as you would like, but I believe that is the best there is for a solution.