它是否取决于值集的数量?它是否取决于 INSERT 语句中的字节数?
8 回答
您可以使用模式插入无限多的记录INSERT ... SELECT
,前提是您在其他表中有这些记录或其中的一部分。
但是,如果您使用INSERT ... VALUES
模式对值进行硬编码,那么您的语句的大小/长度会受到限制:max_allowed_packet限制客户端发送到数据库服务器的 SQL 语句的长度,它会影响任何类型的查询并且不仅适用于 INSERT 语句。
理想情况下,Mysql 允许在单个插入(一次)中创建无限数量的行,但是当一个
MySQL 客户端或 mysqld 服务器接收到一个大于 max_allowed_packet 字节的数据包,它发出一个 Packet too large 错误并关闭连接。
要查看 max_allowed_packet 变量的默认值,请在 MySQL 中执行以下命令:
show variables like 'max_allowed_packet';
标准 MySQL 安装的默认值为 1048576 字节 (1MB)。这可以通过将其设置为会话或连接的更高值来增加。
这将每个人的值设置为 500MB(这就是 GLOBAL 的意思):
SET GLOBAL max_allowed_packet=524288000;
使用新连接检查您在新终端中的更改:
show variables like 'max_allowed_packet';
现在它应该可以在没有任何错误的情况下插入无限记录。谢谢
查询一般受限max_allowed_packet
于。
您将达到 max_allowed_packet 限制并且
错误:1390 准备好的语句包含太多占位符。
你可以在一个sql中放置65535个占位符。所以如果你在一行中有两列,你可以在一个sql中插入32767行。
在 MySQL 中导入 50K+ 记录会出现一般错误:1390 Prepared statement contains too many placeholders
参考http://forums.mysql.com/read.php?20,161869,和你的mysql配置有关:max_allowed_packet
,,, bulk_insert_buffer_size
.key_buffer_size
您可以使用一个 INSERT 语句插入无限数量的行。例如,您可以执行一个循环执行一千次的存储过程,每次运行一个 INSERT 查询。
或者您的 INSERT 可能会触发本身执行 INSERT 的触发器。这触发了另一个触发器。等等。
不,它不取决于值集的数量。它也不取决于字节数。
括号的嵌套深度是有限制的,总语句的长度也有限制。具有讽刺意味的是,thedailywtf.com 上引用了这两者。但是,我上面提到的两种方法都绕过了这些限制。
我相信对于每个 INSERT 插入的行数没有定义,但一般查询可能存在某种最大大小。
它受 max_allowed_packet 限制。
您可以使用以下方式指定:
mysqld --max_allowed_packet=32M
默认为 16M。
您也可以在 /etc/mysql/ 中的 my.cnf 中指定