【问题标题】:HSQLDB (HyperSQL): Changing column type in a TEXT tableHSQLDB (HyperSQL):更改 TEXT 表中的列类型
【发布时间】:2019-03-09 21:44:32
【问题描述】:

对于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()));
            }
        }
    }

【问题讨论】:

  • 请发布一个minimal reproducible example,其中包括表格的创建、填充和修改(最好只有一列),以便我们有所有可移动的部分来重现您的问题。

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


【解决方案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(基于磁盘)表。

当我清理它时会出现代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-27
    • 2023-04-09
    • 2019-07-28
    相关资源
    最近更新 更多