HSQLDB (HyperSQL):更改 TEXT 表中的列类型



对于 CsvCruncher 项目, 我正在将CSV文件加载到HSQLDB中。

CREATE TEXT TABLE concat_1 ( Op VARCHAR(255), id VARCHAR(255), uuid VARCHAR(255), session_id VARCHAR(255) )
SET TABLE concat_1 SOURCE '.../concat_1.csv;encoding=UTF-8;cache_rows=50000;cache_size=10240000;ignore_first=true;fs=,;qc=quote'

在创建表和加载时,我对列值一无所知。

为了加快 SELECT 的速度,我正在尝试将列(加载后(转换为其他类型的列,依靠以下 HSQLDB 功能:

"HyperSQL允许更改类型,如果所有现有值都可以转换 转换为新类型,而不会截断字符串或丢失有效数字。

ALTER TABLE concat_1 ALTER COLUMN id SET DATA TYPE BIGINT

但是当我尝试这样做时,我得到:

operation is not allowed on text table with data in statement

HSQLDB 是否可以在不将 TEXT 表复制到普通(本机(表中的情况下做到这一点?

这是代码,供您想象:

for (String colName : colNames) {
String sqlTypeUsed = null;
for (String sqlType : new String[]{"TIMESTAMP","UUID","BIGINT","INTEGER","SMALLINT","BOOLEAN"}) {
String sqlCol = String.format("ALTER TABLE %s ALTER COLUMN %s SET DATA TYPE %s",
tableName, colName, sqlTypeUsed = sqlType);
log.info("Column change attempt SQL: " + sqlCol);
try (Statement st = this.conn.createStatement()) {
st.execute(sqlCol);
log.info(String.format("Column %s.%s converted to to %s", tableName, colName, sqlTypeUsed));
} catch (SQLException ex) {
log.info(String.format("Column %s.%s values don't fit to %s.n  %s",
tableName, colName, sqlTypeUsed, ex.getMessage()));
}
}
}

我想通了。尽管没有文档,但绑定到 CSV 文件时无法更改 TEXT 表。

我做了什么:

1(我没有尝试每种类型的ALTER,而是查询了SELECT CAST (<col> AS <type>)
2(我收集了该列可以容纳的所有类型,并选择了最具体和最小的类型。
3(然后我拆下桌子-SET TABLE <table> SOURCE OFF.
4(然后我做了ALTER COLUMN
5(最后,重新连接 -SET TABLE <table> SOURCE ON.

这样,表最终会得到最合适的类型,并且缓存和索引的工作方式更加最佳。

但是,对于大型表,可能需要将生成的表翻转为本机CACHED(基于磁盘(表。

当我清理它时,代码来了。

相关内容

  • 没有找到相关文章

最新更新