sql - HSQLDB (HyperSQL):更改 TEXT 表中的列类型
问题描述
对于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()));
}
}
}
解决方案
我想通了。虽然没有记录,但在绑定到 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
(基于磁盘)表。
当我清理它时代码来了。
推荐阅读
- c# - 检索项目的父项时出错:找不到与给定名称“ThemeOverlay.AppCompat.Light”匹配的资源
- html - Scale Div with screen size including children, text and images
- python - 未加载库:@rpath/libboost_thread.dylib
- android - 如何在改造中检查空值
- c - 拆分 ac 文件并使用 Makefile
- r - 根据变量的长度分开
- sql - PostgreSQL 合并许多表以创建新表
- laravel - Laravel:An entity has 2 foreign keys how to display that entity which belong to the specific table?
- java - Is it possible to determine which rows are affected by SQL Server UPDATE?
- oracle - Knowage BI Oracle DataSource