【问题标题】:Liquibase H2 create sequence failed with bigintLiquibase H2 创建序列因 bigint 而失败
【发布时间】:2020-08-26 00:12:54
【问题描述】:

使用 liquibase 3.8.9,运行以下变更集成功:

<changeSet author="quarkus" id="1-1">
        <createSequence cacheSize="1" cycle="false" incrementBy="1" maxValue="9223372036854775807" minValue="1" schemaName="myschema" sequenceName="mytable_id_seq" startValue="1"/>
</changeSet>

添加数据类型 bigint 规范失败:

<changeSet author="quarkus" id="1-1">
    <createSequence cacheSize="1" cycle="false" dataType="bigint" incrementBy="1" maxValue="9223372036854775807" minValue="1" schemaName="myschema" sequenceName="mytable_id_seq" startValue="1"/>
</changeSet>

堆栈跟踪

ERROR: Failed to start application
java.lang.IllegalStateException: liquibase.exception.MigrationFailedException: Migration failed for change set db-test/changelog-0.xml::1-1::quarkus:
     Reason: liquibase.exception.DatabaseException: Syntax error in SQL statement "CREATE SEQUENCE MYSCHEMA.MYTABLE_ID_SEQ AS[*] BIGINT START WITH 1 INCREMENT BY 1 MINVALUE 1 MAXVALUE 9223372036854775807"; SQL statement:
CREATE SEQUENCE myschema.mytable_id_seq AS bigint START WITH 1 INCREMENT BY 1 MINVALUE 1 MAXVALUE 9223372036854775807 [42000-200] [Failed SQL: (42000) CREATE SEQUENCE myschema.mytable_id_seq AS bigint START WITH 1 INCREMENT BY 1 MINVALUE 1 MAXVALUE 9223372036854775807]

bigint 数据类型有限制吗?

谢谢

【问题讨论】:

  • 能否请您提供异常与堆栈跟踪或您收到的错误消息?
  • According to the H2 manual 序列总是使用 bigint 创建的,并且有 no option 可以更改它
  • 这意味着 liquibase 应该忽略 dataType="bigint" 指令。

标签: h2 liquibase


【解决方案1】:

正如您的例外所说,SQL 语法有错误。

[42000-200] [Failed SQL: (42000) 
CREATE SEQUENCE myschema.mytable_id_seq AS bigint START WITH 1 INCREMENT BY 1 MINVALUE 1 MAXVALUE 9223372036854775807

我相信是因为保留字bigint。也许这是 Liquibase 创建 SQL 查询的机制中的一个错误。我尝试在我的本地环境中执行你的 changeSet,得到了同样的错误。

所以我已经从 changeSet 中删除了 dataType="bigint" 并且它起作用了。

<changeSet author="quarkus" id="1-1">
    <createSequence cacheSize="1" cycle="false" incrementBy="1"
                    maxValue="9223372036854775807" minValue="1" schemaName="public"
                    sequenceName="mytable_id_seq" startValue="1"/>
</changeSet>

经过一些 Liquibase 源代码调试后,我发现了为这个 changeSet 生成的 SQL 查询:

CREATE SEQUENCE MYSCHEMA.MYTABLE_ID_SEQ 
START WITH 1 
INCREMENT BY 1 
MINVALUE 1 
MAXVALUE 9223372036854775807

正如@a_horse_with_no_name 在 cmets 中提到的,dataType 默认为bigint

【讨论】:

    猜你喜欢
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-07
    • 2017-07-10
    相关资源
    最近更新 更多