利用序列将Liquibase数据加载到HSQLDB中

时间:2011-01-19 22:06:23

标签: hsqldb liquibase

我正在尝试使用Liquibase 1.9.5将一些数据加载到HSQLDB数据库中。我有一个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值设置为现有序列中的下一个值:

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 个答案:

答案 0 :(得分:3)

您可以通过在目标表上定义触发器来实现此目标,以便在插入的值是您定义的常量时使用序列。查看相关问题 Link a sequence with to an identity in 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。可以使用SQLTool(HSQLDB实用程序)

将其导入HSQLDB

答案 1 :(得分:2)

使用liquibase 2.0,您可能会有更多选择。如果定义为number,它可能不再引用id值,和/或您可以扩展loadData更改类以包含SQL。

答案 2 :(得分:1)

您可以指定该列是计算值:

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

这可以防止liquibase在值周围加上引号。

答案 3 :(得分:0)

您可以使用以下标记:

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

答案 4 :(得分:0)

使用liquibase 3.2解决方案对我来说非常有效:

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

该定义将创建&#34; mytable&#34;表和&#34; mytable_id_seq&#34;顺序也是如此。 然后,在以CSV格式定义数据时,只需省略ID列。 Liquibase将完成其余的工作。