HSQLDB:奇怪的“唯一约束或索引违规”,从 CSV 读取数据

Posted

技术标签:

【中文标题】HSQLDB:奇怪的“唯一约束或索引违规”,从 CSV 读取数据【英文标题】:HSQLDB: weird "unique constraint or index violation" with data read from CSV 【发布时间】:2010-08-25 02:21:36 【问题描述】:

我有一个工具可以读取 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) );

知道是什么原因造成的吗?

谢谢,昂德拉

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于HSQLDB:奇怪的“唯一约束或索引违规”,从 CSV 读取数据的主要内容,如果未能解决你的问题,请参考以下文章

使用 HSQLDB 关键字的奇怪行为

hsqldb 中时间戳大小的奇怪行为

HSQLDB 索引不一致

Hibernate Update 在 HSQLDB 中转换删除/插入

Hsqldb - 如何删除 char 字段上的填充

使用 Hibernate 更新 HSQLDB 上的 LOB/BLOB 值会产生数据异常