代码之家  ›  专栏  ›  技术社区  ›  Ondra Žižka David Lilljegren

hsqldb:奇怪的“唯一约束或索引冲突”,从csv读取数据

  •  1
  • Ondra Žižka David Lilljegren  · 技术社区  · 14 年前

    我有一个工具可以读取一个csv文件,使用hsqldb从中进行选择,并将结果保存为另一个csv文件。这里更多: http://ondra.zizka.cz/stranky/programovani/java/apps/CsvCruncher-csv-manipulation-sql.texy

    现在,当我把它用于某项任务时,我得到了:

    java -jar CsvCruncher-1.0.jar result.csv foo.csv 'SELECT * FROM indata'

    INFO:   SQL: CREATE TEXT TABLE indata ( xrelease VARCHAR(255), xtype VARCHAR(255), xartifact VARCHAR(255), xversion VARCHAR(255) )
    INFO:   SQL: CREATE TEXT TABLE output ( XRELEASE VARCHAR(255), XTYPE VARCHAR(255), XARTIFACT VARCHAR(255), XVERSION VARCHAR(255) )
    INFO:   User's SQL: INSERT INTO output (SELECT * FROM indata)
    INFO: Database closed
    Exception in thread "main" java.sql.SQLException: integrity constraint violation: unique constraint or index violation: SYS_IDX_10027
        at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
        at org.hsqldb.jdbc.JDBCPreparedStatement.fetchResult(Unknown Source)
        at org.hsqldb.jdbc.JDBCPreparedStatement.executeUpdate(Unknown Source)
        at org.jboss.qa.cvscruncher.Cruncher.crunch(Cruncher.java:187)
        at org.jboss.qa.cvscruncher.App.main(App.java:26)
        at Crunch.main(Crunch.java:9)
    Caused by: org.hsqldb.HsqlException: integrity constraint violation: unique constraint or index violation: SYS_IDX_10027
        at org.hsqldb.error.Error.error(Unknown Source)
        at org.hsqldb.index.IndexAVL.insert(Unknown Source)
        at org.hsqldb.persist.RowStoreAVLDiskData.indexRow(Unknown Source)
        at org.hsqldb.Table.insertSingleRow(Unknown Source)
        at org.hsqldb.StatementDML.insertRowSet(Unknown Source)
        at org.hsqldb.StatementInsert.getResult(Unknown Source)
        at org.hsqldb.StatementDMQL.execute(Unknown Source)
        at org.hsqldb.Session.executeCompiledStatement(Unknown Source)
        at org.hsqldb.Session.execute(Unknown Source)
        ... 5 more
    

    从日志中可以看到,没有创建索引,至少没有明确地创建索引。我试图在hsqldb的手册中找到一些自动创建的约束,但没有找到。

    当我只做 SELECT 1 FROM indata 很好。所以我想这是数据本身的问题。对于这种情况,它们是: http://pastebin.com/8QiY2HXx ( x 以防止关键字冲突)。

    更新:

    当我转储从csv读取的数据时,有点奇怪:

     -------
     XRELEASE: 5.1.0-SNAPSHOT
     XTYPE: DEP
     XARTIFACT: org.apache.maven:maven-ant-tasks
    5XVERSION: 2.0.9
     -------
     XRELEASE: 5.1.0-SNAPSHOT
     XTYPE: DEP
     XARTIFACT: org.jboss.seam.integration:jboss-seam-int-microcontainer
    5XVERSION: 5.1.0.CR1
     -------
     XRELEASE: 5.1.0-SNAPSHOT
     XTYPE: DEP
     XARTIFACT: org.jboss.seam.integration:jboss-seam-int-jbossas
    5XVERSION: 5.1.0.CR1
     -------
    ...
    

    看起来像 xversion 以某种方式修改列。 代码很简单 System.out.println(" "+ metaData.getColumnLabel(i) + ": "+ rs.getObject(i) );

    你知道是什么引起的吗?

    谢谢,Ondra

    2 回复  |  直到 7 年前
        1
  •  3
  •   Ondra Žižka David Lilljegren    7 年前

    问题出在输入文件中-它包含 0x0D 作为新线,不知何故它打破了HSQLDB。我会报告的,以便他们检查。至少它应该拒绝无效的输入,或者更好地转换换行符。

        2
  •  2
  •   fredt    14 年前

    请检查数据库的.script和.log文件。这将显示数据库中的实际表定义。如果找不到原因,请通过Bug跟踪器(参见“支持”页面)和示例数据文件向hsqldb报告Bug。错误很快就被修复了。

    推荐文章
    kambi  ·  使用MD5检查完整性
    10 年前