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

Возможно ли это с 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()));
            }
        }
    }

person Ondra Žižka    schedule 04.10.2018    source источник
comment
Опубликуйте минимальный воспроизводимый пример, который включает создание, заполнение и модификацию таблицы (желательно только одного столбца), чтобы у нас есть все движущиеся части, чтобы воспроизвести вашу проблему.   -  person Mark Rotteveel    schedule 04.10.2018


Ответы (1)


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

Код придет, когда я его уберу.

person Ondra Žižka    schedule 04.10.2018