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

时间:2018-10-04 13:17:02

标签: sql type-conversion hsqldb alter-table alter-column

对于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

在不将TEXT表复制到普通(本机)表的情况下,使用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()));
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

我想通了。尽管未记录,但绑定到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(基于磁盘)表中。

我清理代码时就会收到。