0

一些前置问题信息:

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

其他信息:

  • 这些表有 5 列: int | varchar(32) | 整数 | 整数 | 整数
  • 这些表有两个键:第 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 错误,程序完全停止/崩溃,然后才能打印出任何有价值的东西。

4

2 回答 2

1

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

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

于 2013-07-30T12:28:50.903 回答
1

SQLite 对可以像这样组合的子查询有限制。

INSERT只需为每一行创建一个简单的语句。如果您将所有内容都放在一个事务中,这将同样快。

于 2013-07-30T14:44:47.197 回答