HSQLDB (HyperSQL): изменение типа столбца в таблице TEXT - PullRequest
0 голосов
/ 04 октября 2018

Для проекта 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

Возможно ли это с HSQLDB без дублирования таблицы TEXT в обычную (нативную) таблицу?

Вот код для вашего воображения:

    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 голосов
/ 04 октября 2018

Я разобрался.Хотя это не задокументировано, таблицы TEXT не могут быть изменены при привязке к 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 (на основе диска) таблица.

Код приходит, когда я его очищаю.

...