MySQL-我可以在一条INSERT语句中插入几行?


Answers:


93

您可以使用INSERT ... SELECTpattern插入无数记录,前提是您在其他表中有这些记录或部分记录。

但是,如果您使用INSERT ... VALUES模式对值进行硬编码,则语句的大小/长度是有限制的:max_allowed_pa​​cket限制了客户端发送到数据库服务器的SQL语句的长度,并且会影响任何类型的查询不仅适用于INSERT语句。


44

理想情况下,Mysql允许在一次插入中一次创建无限数量的行,但是当

MySQL客户端或mysqld服务器接收到一个大于max_allowed_pa​​cket字节的数据包,它发出Packet太大错误并关闭连接。

要查看max_allowed_pa​​cket变量的默认值是什么,请在MySQL中执行以下命令:

show variables like 'max_allowed_packet';

标准MySQL安装的默认值为1048576字节(1MB)。可以通过将其设置为会话或连接的较高值来增加此值。

这会将每个人的值设置为500MB(这就是GLOBAL的意思):

SET GLOBAL max_allowed_packet=524288000;

使用新的连接检查新终端中的更改:

show variables like 'max_allowed_packet';

现在,它可以无限制地插入无限记录。谢谢


11
500 MB不是无限的。它比默认值大得多,但仍然不是无限的。
Carlos2W

一个问题:这个限制到底是什么?查询本身?那么执行语句时绑定的数据呢?我可以安全strlen($query_with_questionmarks) < $max_alloweed_packet吗,直到?
pilat

如果您尝试将其设置为最大可能的值,则为1GB,如下所示:SET GLOBAL max_allowed_pa​​cket = 1073741824
PHP Guru



6

您可以使用一条INSERT语句插入无数行。例如,您可以执行一个存储过程,该存储过程的循环执行一千次,每次运行INSERT查询。

否则,您的INSERT可能会触发本身执行INSERT的触发器。哪个触发另一个触发器。等等。

不,它不取决于值集的数量。它也不取决于字节数。

括号的嵌套深度是有限制的,而总语句的长度是有限制的。具有讽刺意味的是,这两个引用都在thedailywtf.com上引用。但是,我上面提到的两种方法都可以绕过这些限制。


您的示例用于运行多个INSERT,并且没有显示在一个INSERT语句中插入多行..
Lukman 2010年

@Lukman:一个INSERT查询可能导致多个INSERTS命中数据库。这只是谁在计算什么的问题。
2010年

2
确实如此,但是您的第一个示例显示了如何在一个循环中运行查询,每个循环都运行一个INSERT语句,并且关于一个插入多行的INSERT语句并没有说明。这只是一个重点问题。
卢克曼

没有人可以做无限的事情。总会有资源限制。
阿德里安

这也适用于SELECT ... FROM语句吗?我的意思是,如果已经使用max_allowed_pa​​cket首先插入了数据,那么在那之后是否也应该选择这种方式呢?我不明白为什么将它应用于所有其他语句,就像其他海报所说的那样,当它首先必须首先插入其他任何东西之前。
Thielicious


2

我相信没有限制为每个INSERT插入的行数,但是一般来说查询可能会有某种最大大小。


2

它受max_allowed_pa​​cket的限制。
您可以使用以下方式指定: mysqld --max_allowed_packet=32M 默认为16M。
您也可以在/ etc / mysql /中的my.cnf中指定

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.