SQLite数据库的最大插入

时间:2013-07-30 12:22:51

标签: java sqlite

一些问前信息:

我试图将整个表从MySQL转换为SQLite(以及其他人,但从那里开始)。这是必须在java中完成的事情,并且必须能够进行大量转换。但是,在执行我的SQLite语句(相当大)时,整个程序只会锁定并冻结。还有一个事实是,当我在崩溃后查看SQLite数据库时,没有添加任何一行。

其他信息:

  • 表格有5列:int | varchar(32)| int | int | INT
  • 这些表有两个键:第1列是主键(id),第2列是用户名的唯一键。

Java代码:

MySQL db = new MySQL();
StringBuilder sb = new StringBuilder("INSERT OR IGNORE INTO `playTime` ");
try {
    db.open();
    ResultSet ret = db.query("SELECT * FROM `playTime`");
    int i = 1;
    while (ret.next()) {
        if (i > 1) {
            sb.append("UNION SELECT ").append(i).append(", '").append(ret.getString(2)).append("', ").append(ret.getInt(3)).append(", ").append(ret.getInt(4)).append(", ").append(ret.getInt(5)).append(" ");
        } else {
            sb.append("SELECT ").append(i).append(" AS 'column1', '").append(ret.getString(2)).append("' AS 'column2', ").append(ret.getInt(3)).append(" AS 'column3', ").append(ret.getInt(4)).append(" AS 'column4', ").append(ret.getInt(5)).append(" AS 'column5' ");
        }
        i++;
    }
    db.close();
} catch (SQLException e) {
    ...
}

此代码为新的SQLite查询生成一个字符串,类似于下面的查询。我只是添加了换行符以使其可读,但打印的语句与语法的顺序相同。

INSERT OR IGNORE INTO `playTime` SELECT 1 AS 'column1', 'examplename1' AS 'column2', 5696 AS 'column3', 0 AS 'column4', 1 AS 'column5'
UNION SELECT 2, 'examplename2', 18145, 0, 1
UNION SELECT 3, 'examplename3', 69793, 89, 0
UNION SELECT 4, 'examplename4', 51335, 16, 0
...

总的来说,从MySQL数据库中取出了11077行,然后我尝试将这些行再次添加到我所创建的SQLite数据库文件中。我知道它是大量数据,但是在执行查询时,程序整体冻结。如果线程没有足够大的堆栈大小用于手头的工作,这可能是一个错误吗?如果是这样,为什么不打印StackOverFlow错误?

根据我的理解和研究,就SQLite的局限性而言,我完全处于极限之内。正如sqlite.org网页(http://www.sqlite.org/limits.html)所述,sql语句中文本的最大字节数为1000000,而我的语句大约为480,000字节。我无法找到任何与可编辑的最大行相关的信息,我认为没有任何信息。

我只是重复一遍,我看到没有可见的java错误,程序完全停止/崩溃,然后才能打印出任何有价值的内容。

2 个答案:

答案 0 :(得分:1)

为什么它很慢?因为它试图解析一个拥有11077个联合并在其中选择的SQL语句!这对解析器来说非常困难。我不知道这对这个问题很重要,但是union也会删除列表与更快的“concat”运算符union all

正如Tichodroma在评论中所说,通过CSV导出/导入是最佳选择。

答案 1 :(得分:1)

SQLite对子查询有一个限制,可以这样组合。

只需为每一行创建一个简单的INSERT语句。 如果你把所有东西都放在一个交易中,这将同样快。