MySQL - 一次 INSERT 语句最多可以插入多少行数据?

107

这取决于值集的数量吗?这取决于插入语句中的字节数吗?

8个回答

103

您可以使用INSERT ... SELECT模式插入无限数量的记录,前提是您在其他表中拥有这些记录或其中的一部分。

但是,如果您使用INSERT ... VALUES模式硬编码值,则语句长度存在限制:max_allowed_packet,它限制了客户端发送到数据库服务器的SQL语句长度,并且它影响任何类型的查询,而不仅仅是INSERT语句。


62
理想情况下,MySQL允许一次插入(即同时)创建无限数量的行,但是当MySQL客户端或mysqld服务器接收到大于max_allowed_packet字节的数据包时,它会发出"Packet too large"错误并关闭连接。
要查看max_allowed_packet变量的默认值是什么,请在MySQL中执行以下命令: show variables like 'max_allowed_packet'; 标准的MySQL安装具有1048576字节(1MB)的默认值。可以通过为会话或连接设置更高的值来增加它。
以下将全局值设置为500MB: SET GLOBAL max_allowed_packet=524288000; 在新连接中的新终端中检查更改: show variables like 'max_allowed_packet'; 现在应该可以无限制地插入记录而没有任何错误。谢谢

14
500 MB并不是无限的。它比默认值要大得多,但仍然不是无限的。 - Carlos2W
1
一个问题:这个限制到底是为了什么?是查询本身吗?执行语句时绑定的数据呢?如果 strlen($query_with_questionmarks) < $max_alloweed_packet,我能保证安全吗? - pilat
如果您想将其设置为最大可能值,即1GB,应该像这样:SET GLOBAL max_allowed_packet=1073741824。 - PHP Guru

25

一般来说,查询受 max_allowed_packet 的限制。


13

10

6
你可以使用一个INSERT语句插入无限数量的行。例如,你可以执行一个存储过程,循环执行一千次,每次运行一个INSERT查询。
或者你的INSERT语句可能会触发一个触发器,该触发器本身执行一个INSERT操作。这将触发另一个触发器,以此类推。
不,它并不取决于值集的数量。也不取决于字节数量。
你的括号嵌套深度和总语句长度都有限制。这两个限制都被引用在thedailywtf.com上,具有讽刺意味。然而,我上面提到的两种方法都可以绕过这些限制。

你的例子是用于运行多个INSERT,它并没有展示如何在一个INSERT语句中插入多行。 - Lukman
@Lukman:一个INSERT查询可能会导致多个INSERT命中数据库。这只是谁在计算什么的问题。 - Borealid
2
没错,但是你的第一个例子展示了在循环中运行查询,并且每次循环只运行一条INSERT语句,它并没有说明这一条INSERT语句是否插入了多行数据。这只是强调的问题。 - Lukman
没有人可以做无限的事情。总会有资源限制。 - Adrien
这也适用于SELECT ... FROM语句吗?我的意思是,如果数据在第一次插入时使用了max_allowed_packet,那么之后也应该能够选择它。我不明白为什么像其他帖子中所说的那样,它适用于所有其他语句,当它首先必须被插入到任何其他东西之前。 - Thielicious

3

这受到 max_allowed_packet 的限制。
您可以通过以下方式进行指定: mysqld --max_allowed_packet=32M 默认情况下为 16M。
您也可以在 /etc/mysql/ 下的 my.cnf 文件中指定。


3

我相信在每个INSERT中你可以插入的行数没有固定的限制,但是总的查询大小可能会有某种最大限制。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接