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

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

对于该项目, 我正在将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'
在创建表和加载时,我对列值一无所知

为了加快选择的速度,我正在尝试将列(加载后)转换为其他类型,依赖于此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()));
            }
        }
    }