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

时间:2015-08-24 18:16:56

标签: mysql sql prepared-statement

我正在使用以下(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)

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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