我有一个工具,它读取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
答案 0 :(得分:4)
问题出在输入文件中 - 它包含0x0D
作为换行符,并以某种方式打破了HSQLDB。我会报告,以便他们检查。至少它应该拒绝无效输入或更好地转换换行符。
答案 1 :(得分:2)
请检查数据库的.script和.log文件。这将显示数据库中实际的表定义。如果找不到原因,请通过Bug Tracker(请参阅“支持”页面)向样本数据文件报告错误到HSQLDB。错误很快得到修复。