java load data infile查询丢弃错误的行

时间:2011-07-21 06:47:22

标签: java mysql load-data-infile

Java应用程序使用加载数据infile 查询将数据插入mysql。在csv文件中,一些错误的格式化值,如缺少行,不正确的字段(整数值的字符串值)。如果文件中存在不正确的记录(行),则java应用程序抛出异常,并且不添加任何记录,甚至是正确的行。如果使用heidi sql程序(sql客户端程序)对同一文件执行相同的查询,则添加所有记录,甚至是非正确的行(为缺少字段设置空值等)。我只想让我的java应用程序表现得像sql客户端,把所有行至少插入格式正确的行。

感谢。

SQL

load data infile '/a.txt'  into table test_data fields terminated by ','

代码段

public void query(String query, Connection conn) throws SQLException {

        PreparedStatement ps = null;
        try {
            ps = conn.prepareStatement(query);
            ps.executeUpdate();
        } catch (MySQLTransactionRollbackException e) {
            logger.error("", e);
            throw new MySQLTransactionRollbackException();
        } catch (SQLException e) {
            logger.error("", e);
            throw new SQLException(e);
        } finally {

            if (ps != null) {
                try {
                    ps.close();
                } catch (Exception e) {
                    logger.error("", e);
                }
            }

            try {
                conn.close();
            } catch (SQLException e) {
                logger.error("", e);
            }

        }
    }

3 个答案:

答案 0 :(得分:0)

它不能丢弃错误的行,因为它们可能导致整个文件的解析失败。使用非常好的算法可以完成,但我认为不会有100%的准确性。

答案 1 :(得分:0)

忽略关键字是解决方案。

load data infile '/a.txt'  **ignore** into table test_data fields terminated by ','

答案 2 :(得分:0)

忽略是正确的,但假设您需要知道已删除记录的详细信息..

冗长乏味的解决方案是在加载后转储文件,并使用diff say将PK值与infile的提取进行比较。

但是,这不会将关键违规与参照完整性违规区分开来。