Загрузка данных Liquibase в HSQLDB с помощью последовательности - PullRequest
0 голосов
/ 20 января 2011

Я пытаюсь загрузить некоторые данные в базу данных HSQLDB, используя Liquibase 1.9.5. У меня есть loadData команда следующим образом:

<loadData tableName="LIST_ITEM_TYPE" file="data/global/list_item_type.csv">
    <column name="ID" type="NUMERIC" />
    <column name="NAME" type="STRING" />
    <column name="DESCRIPTION" type="STRING" />
</loadData>

В моем файле данных CSV я пытаюсь установить значение идентификатора на следующее значение из существующей последовательности:

id,name,description
next value for SEQ_ITEM_TYPE_ID,Test Name,A test description

Однако это не работает, так как генерирует следующий SQL:

INSERT INTO LIST_ITEM_TYPE (id, description, name) VALUES ('next value for SEQ_ITEM_TYPE_ID', 'A test description', 'Test Name')

Это почти правильно, за исключением того, что одинарные кавычки, добавленные Liquibase вокруг next value for SEQ_ITEM_TYPE_ID, заставляют HSQLDB выдавать следующую ошибку:

java.sql.SQLException: data exception: invalid character value for cast

Если я удаляю кавычки sinqle и запускаю этот SQL вручную, он работает как положено.

Итак, мой вопрос: как мне использовать команду Liquibase loadData, извлекающую данные из файла CSV при заполнении одного из столбцов из последовательности?

Ответы [ 5 ]

3 голосов
/ 20 января 2011

Вы можете достичь этой цели, определив триггер в целевой таблице, чтобы использовать последовательность, когда вставленное значение является определенной вами константой. Смотрите связанный вопрос Свяжите последовательность с идентификатором в hsqldb

Ваш CSV, вероятно, должен содержать отрицательное значение для столбца ID, и это должно быть проверено в условии триггера WHEN.

CREATE TRIGGER trigg BEFORE INSERT ON list_item_type REFERENCING NEW ROW AS newrow FOR EACH ROW WHEN (id < 0) SET newrow.id = NEXT VALUE FOR seq_item_type_id;

В качестве альтернативы, вставьте несколько последовательных чисел в столбец, используя CSV. После импорта данных используйте оператор UPDATE, чтобы установить значения в seequece. Это практично, когда стол небольшой. Обратите внимание, что порядковые номера во вставке гарантируют, что вставка завершится успешно, если ID является первичным ключом.

UPDATE list_item_type SET id = NEXT VALUE FOR seq_item_type_id

Третий вариант (без использования Liquibase) - создать файл импорта в виде операторов вставки SQL, а не CSV. Это можно импортировать в HSQLDB с помощью SQLTool (утилита HSQLDB)

2 голосов
/ 22 января 2011

С liquibase 2.0 у вас может быть больше возможностей. Он может больше не заключать в кавычки значение id, если оно определено как число, и / или вы можете расширить класс изменений loadData для включения SQL.

1 голос
/ 08 марта 2016

Вы можете указать, что столбец является вычисляемым значением:

<column name="id" type="computed"/>

, что предотвращает расстановку кавычек вокруг значения.

0 голосов
/ 30 октября 2014

Решение отлично работает для меня с liquibase 3.2:

 <createTable tableName="mytable">
        <column autoIncrement="true" name="id" type="BIGINT">
            <constraints primaryKey="true" primaryKeyName="mytablePK" />
        </column>
        ...
</createTable>

Это определение также создаст таблицу "mytable" и последовательность "mytable_id_seq".Затем, при определении данных в CSV, просто опустите столбец ID там.Liquibase сделает все остальное.

0 голосов
/ 22 января 2011

Вы можете использовать тег следующим образом:

<modifySql>
   <replace 
        replace="'next value for SEQ_ITEM_TYPE_ID'" 
        with="next value for SEQ_ITEM_TYPE_ID">
</modifySql>
...