Mysql:插入多行时语法错误

Mysql: Syntax error when inserting multiple rows

提问人:Martin 提问时间:10/9/2023 更新时间:10/9/2023 访问量:78

问:

我正在向数据库(MySQL 8.0.32,InnoDB 引擎)插入 23,000 行。如果我将行拆分为 15,135 个块,一切正常。但是,如果我将其拆分为 15,136 个块(相同的代码),应用程序会抛出以下错误:

Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ':ticker_id_0 

生成的 sql 是:

INSERT INTO ticker_time_series (ticker_id,date,close,percentage_change) VALUES (:ticker_id_0,:date_0,:close_0,:percentage_change_0),(:ticker_id_1,:date_1,:close_1,:percentage_change_1),(:ticker_id_2,:date_2,:close_2,:percentage_change_2), ...

我试着增加max_allowed_packet,max_prepared_stmt_count。它们都不起作用。

php mysql pdo mysql-8.0

评论

0赞 Bill Karwin 10/9/2023
FWIW,无论如何我都不会尝试使用大于 1,000 的块。你为什么要突破界限?
0赞 Juan Carlos 10/9/2023
你有没有试过一次性插入它们?我定期重新创建一个包含超过 150,000 条记录的表,完全没有问题
0赞 Martin 10/9/2023
@BillKarwin 为什么不超过1000人?插入 30-100 x 1,000 比一次插入 30,000 慢。
2赞 Bill Karwin 10/9/2023
另外,我评论说,如果批量插入性能如此重要,则根本不应该使用 INSERT。您应该使用 LOAD DATA INFILE。
1赞 Bill Karwin 10/9/2023
我也不知道是什么原因导致了这个错误,但你还没有展示你的代码,所以我在脑海中对你如何实现代码做了一些假设。一种可能性是这是PDO中的问题,而不是MySQL中的问题。PDO负责将命名占位符like转换为MySQL理解的占位符,这只是一个位置样式占位符。也许 PDO 只对前 N 个字符进行转换?我不知道。:ticker_id_0?

答: 暂无答案