首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HSQLDB (HyperSQL):更改文本表中的列类型

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

Stack Overflow用户
提问于 2018-10-04 13:17:01
回答 1查看 860关注 0票数 1

对于CsvCruncher项目,我将把一个CSV文件加载到HSQLDB中。

代码语言:javascript
复制
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允许更改类型。”

代码语言:javascript
复制
ALTER TABLE concat_1 ALTER COLUMN id SET DATA TYPE BIGINT

但当我尝试的时候,我得到了:

代码语言:javascript
复制
operation is not allowed on text table with data in statement

在不将文本表复制到正常(本机)表的情况下,HSQLDB可以这样做吗?

这是你想象的密码:

代码语言:javascript
复制
    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()));
            }
        }
    }
EN

回答 1

Stack Overflow用户

发布于 2018-10-04 16:37:36

我想出来了。虽然没有文档化,但是在绑定到CSV文件时,不能更改文本表。

我所做的:

1)我没有尝试使用每种类型的ALTER,而是询问SELECT CAST (<col> AS <type>)

2)我收集了列所能容纳的所有类型,并选择了最具体和最小的类型。

3)然后我分离了表- SET TABLE <table> SOURCE OFF

4)然后我做了ALTER COLUMN

5)重接- SET TABLE <table> SOURCE ON

这样,表以最合适的类型结束,缓存和索引工作得更好。

但是,对于大型表,将结果表翻转到本机CACHED (基于磁盘)表可能是值得的。

当我清理它的时候密码就来了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52647738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档