HSQLDB(HyperSQL):更改文本表中的列类型
对于该项目, 我正在将CSV文件加载到HSQLDB中HSQLDB(HyperSQL):更改文本表中的列类型,sql,type-conversion,hsqldb,alter-table,alter-column,Sql,Type Conversion,Hsqldb,Alter Table,Alter Column,对于该项目, 我正在将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;f
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'
在创建表和加载时,我对列值一无所知
为了加快选择的速度,我正在尝试将列(加载后)转换为其他类型,依赖于此HSQLDB功能:
“如果可以强制转换所有现有值,则HyperSQL允许更改类型
在不截断字符串或丢失有效数字的情况下转换为新类型。“
但当我尝试时,我得到:
operation is not allowed on text table with data in statement
HSQLDB是否可以在不将文本表复制到普通(本机)表的情况下实现这一点
以下是代码,供您想象:
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文件时无法更改 我所做的: 1) 我没有尝试对每种类型进行
ALTER
,而是查询SELECT CAST(AS)
2) 我收集了该专栏可以容纳的所有类型,并选择了最具体和最小的。
3) 然后我分离了表-
将表源设置为OFF
4) 然后我做了
ALTER列
5) 最后,重新连接-
打开
设置表源
通过这种方式,表的类型最合适,缓存和索引的工作也更为优化
但是,对于大型表,将生成的表转换为本地缓存的(基于磁盘的)表是值得的
当我清理它时会出现代码。请发布一个包含表格创建、填充和修改(最好只包含一列)的帖子,这样我们就有了所有活动部分来重现问题。
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()));
}
}
}