97

它是否取决于值集的数量?它是否取决于 INSERT 语句中的字节数?

4

8 回答 8

97

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

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

于 2010-08-21T03:22:02.663 回答
50

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

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

要查看 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';

现在它应该可以在没有任何错误的情况下插入无限记录。谢谢

于 2015-01-09T06:53:48.980 回答
24

查询一般受限max_allowed_packet于。

于 2012-05-21T12:26:46.983 回答
11

您将达到 max_allowed_pa​​cket 限制并且

错误:1390 准备好的语句包含太多占位符。

你可以在一个sql中放置65535个占位符。所以如果你在一行中有两列,你可以在一个sql中插入32767行。

在 MySQL 中导入 50K+ 记录会出现一般错误:1390 Prepared statement contains too many placeholders

于 2017-09-22T09:36:40.163 回答
9

参考http://forums.mysql.com/read.php?20,161869,和你的mysql配置有关:max_allowed_packet,,, bulk_insert_buffer_size.key_buffer_size

于 2013-06-08T09:19:14.380 回答
6

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

或者您的 INSERT 可能会触发本身执行 INSERT 的触发器。这触发了另一个触发器。等等。

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

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

于 2010-08-21T03:14:04.860 回答
3

我相信对于每个 INSERT 插入的行数没有定义,但一般查询可能存在某种最大大小。

于 2010-08-21T03:13:23.150 回答
2

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

于 2013-03-27T05:52:10.583 回答