如何在 mysql 中处理非常长的 SQL INSERT 语句

how to handle very long SQL INSERT statement in mysql

我正在使用以下 (python) 代码生成 (MySQL) SQL INSERT 语句(还有更多列,为简单起见,我将它们省略):

mylist = [('1', '2', '3'),
          ('4', '5', '6'),
          .
          .
          .
          ('7', '8', '9')]

sql_statement = "insert into mytable (col1, col2, col3) values "

for i in mylist:
    if sql_statement == "insert into mytable (col1, col2, col3) values ":
        # append this for the 1st element
        sql_statement += "(" + i[0] + ", " + i[1] + ", " + i[2] + ")"
    else:
        # append this for everything else
        sql_statement += ", (" + i[0] + ", " + i[1] + ", " + i[2] + ")"

这会产生如下所示的字符串:

sql_statement = "insert into mytable (col1, col2, col3) values (1, 2, 3), (4, 5, 6), ... (7, 8, 9)"

然后我使用 sql_statement 来执行 sql 语句。

这种方法的问题是 sql_statement 字符串变长了,插入没有考虑所有数据。

有什么处理方法的建议吗?

更新: 准备语句 是要走的路。 (python) 代码如下所示:

sql_statement = "insert into mytable (col1, col2, col3) values (%s, %s, %s)"

for i in mylist:
    cursor.execute(sql_statement, i)

创建一个事务并逐个插入。最后提交。所以只在一次调用中所有插入操作提交。

您使用的 python 库是否支持准备好的参数化查询?我发现像这样的多值插入与重复执行准备好的语句(至少在 .Net 中)之间的性能差异在除极端情况外的所有情况下都是最小的。 (在那些情况下,两者的结合是最佳的。)

或者,只需跟踪您的查询长度,在它变得太大之前执行,然后重新初始化字符串并继续,直到处理完所有行。