hsqldb - 使用序列将 Liquibase 数据加载到 HSQLDB

我正在尝试使用 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 在 SEQ_ITEM_TYPE_ID 的下一个值 周围添加的单引号导致 HSQLDB 给出以下错误:

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

如果我删除单引号并手动运行该 SQL,它会按预期工作。

所以,我的问题是,如何使用 Liquibase loadData 命令从 CSV 文件中提取数据,同时从序列中填充其中一列?

最佳答案

您可以通过在目标表上定义触发器以在插入的值是您定义的常量时使用序列来实现此目标。查看相关问题 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。当 table 不是很大时,这很实用。如果 ID 是主键,请注意插入中的序号可确保插入成功。

UPDATE list_item_type SET id = NEXT VALUE FOR seq_item_type_id

第三种选择(不使用 Liquibase)是将导入文件创建为 SQL 插入语句而不是 CSV。这可以使用 SQLTool(HSQLDB 实用程序)导入到 HSQLDB

https://stackoverflow.com/questions/4741341/

相关文章:

windows - Perl 中的“打开”语句拆分包含空格的路径 - 如何读取路径中包含空格的文件?

php - 在 Web 服务器环境中的 PHP 中启用进程控制 (PCNTL) 有哪些副作用?

vb6 - 如何枚举计算机上可用的 COM 端口?

sql - 在 SQL 中将列的子集重置为其默认值?

sql-server - SQL Server 数据库还原卡在 99%

.net - 重性高潮不起作用

opengl - 如何将 "clear color"插入属性堆栈

ms-access - 通过 Access VBA 代码保存查询

sql-server - T-SQL 固定宽度输出

datetime - R:计算2个数字时间之间耗时,例如944和1733是469分钟