2011-01-19 18 views
0

我試圖使用Liquibase 1.9.5將一些數據加載到HSQLDB數據庫中。我有一個loadData命令如下:Liquibase數據加載到HSQLDB的序列

<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 DED給以下錯誤:

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

如果我刪除sinqle報價和手動運行該SQL,它按預期工作。

所以,我的問題是,如何使用Liquibase loadData命令從CSV文件中提取數據,同時填充序列中的某一列?

+0

哦,是的,我們正在使用HSQLDB 2.0,如果它很重要的話。 – Andre 2011-01-19 22:06:56

回答

2

使用liquibase 2.0,您可能有更多選項。如果定義爲數字,它可能不再引用id值,並且/或者可以擴展loadData更改類以包含SQL。

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

+0

謝謝,使用觸發器不是我考慮的選項,雖然它看起來像我們不應該做的額外工作。如果在幾天後沒有其他建議進來,將接受你的答案。 – Andre 2011-01-20 13:55:24

+0

增加了一些替代品。 – fredt 2011-01-20 18:34:20

0

您可以使用這樣的標籤:

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

解決方案完美地工作對我來說與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

您可以指定該列是一個計算值:

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

這樣可以防止liquibase從周圍放置值引號。