Open dushaoshuai opened 2 months ago
数据库版本为 MySQL 5.7,使用 gorm 的 Create() 方法向其中批量插入数据,报错 Error 1390 (HY000): Prepared statement contains too many placeholders。
Create()
解决方法,指定批量插入的大小:
CreateInBatches(users, 100)
预处理语句(Prepared Statements)是一种数据库查询优化技术, MySQL 5.7 和 MySQL 8.0 都提供了服务器端预处理语句的支持。在服务器端预先解析并保存 SQL 语句,有以下好处:
在这个官网的例子中:
mysql> PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse'; mysql> SET @a = 3; mysql> SET @b = 4; mysql> EXECUTE stmt1 USING @a, @b; +------------+ | hypotenuse | +------------+ | 5 | +------------+ mysql> DEALLOCATE PREPARE stmt1;
PREPARE
stmt1
?
EXECUTE
DEALLOCATE PREPARE
问题
数据库版本为 MySQL 5.7,使用 gorm 的
Create()
方法向其中批量插入数据,报错 Error 1390 (HY000): Prepared statement contains too many placeholders。解决方法,指定批量插入的大小:
CreateInBatches(users, 100)
方法分批插入,其中 100 指定单批插入 100 条数据预处理语句
预处理语句(Prepared Statements)是一种数据库查询优化技术, MySQL 5.7 和 MySQL 8.0 都提供了服务器端预处理语句的支持。在服务器端预先解析并保存 SQL 语句,有以下好处:
语法
在这个官网的例子中:
PREPARE
解析(预处理)SQL 语句,并将其命名为stmt1
。在 SQL 语句中,?
字符是实际数据的占位符,指示执行语句时实际数据要被绑定到的位置。EXECUTE
执行预处理语句。在这一步,实际数据才被传递给数据库。DEALLOCATE PREPARE
删除预处理语句。和 session 的关系
See also