H2更改约束名称的问题

时间:2018-07-23 14:14:43

标签: h2 flyway

我正在尝试将迁移设置为用于集成测试,但是Flyway无法按预期工作。

下面是修改后的SQL文件示例,以显示我在做什么:

第一版

CREATE TABLE Foobar (
  property1 VARCHAR(999) NOT NULL,
  property2 VARCHAR(999),
  property3 VARCHAR(999),
  id INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY,

  CONSTRAINT Foobar_pk PRIMARY KEY (id)
);

... CREATED OTHER TABLES

第二版

ALTER TABLE Foobar ADD uuid CHAR(36);
ALTER TABLE Foobar DROP CONSTRAINT Foobar_pk;
ALTER TABLE Foobar DROP COLUMN id;
ALTER TABLE Foobar ADD CONSTRAINT Foobar_pk PRIMARY KEY (uuid)

...

第三版

--CREATED ANOTHER TABLE

这是我迁移H2的工作:

  private final String JDBC_H2_CONNECTION_STRING = "jdbc:h2:mem:FooBarDB;MODE=PostgreSQL;DB_CLOSE_DELAY=-1";

  /**
   * Creates the schema of the test database.
   * 
   * @throws SQLException If a SQL error occur.
   */
  @Before
  public void createSchema() throws SQLException {
    final Flyway flyway = new Flyway();

    flyway.setDataSource(JDBC_H2_CONNECTION_STRING, "", "");
    flyway.setInstalledBy(System.getProperty("user.name"));
    flyway.migrate();
  }

  /**
   * Deletes the schema of the test database for posterior use.
   * 
   * @throws SQLException If a SQL error occur.
   */
  @After
  public void deleteSchema() throws SQLException {
    final Flyway flyway = new Flyway();

    flyway.setDataSource(JDBC_H2_CONNECTION_STRING, "", "");
    flyway.clean();
  }

我得到的错误是:

org.flywaydb.core.internal.command.DbMigrate$FlywayMigrateException: SQL State  : 90057
Error Code : 90057
Message    : Constraint "Foobar_PK" not found; SQL statement:
ALTER TABLE Foobar DROP CONSTRAINT Foobar_pk; ALTER TABLE Foobar DROP COLUMN id [90057-197]

乍看起来似乎是一个SQL问题,但是奇怪的是,当直接将Maven插件与生产数据库(使用PostgreSQL)一起使用时,迁移可以完美地进行,这给了我H2这个错误。所以我不知道这是H2的问题还是Flyway的问题(​​因为集成测试使用的是Java版本),或者我是否缺少在这种特殊情况下应该做的事情。


直接在H2上测试SQL并查看目录后,我发现此特定约束有些奇怪。

它没有像Foobar_pk中明确指定的那样被命名为CONSTRAINT Foobar_pk PRIMARY KEY (id),而是被命名为CONSTRAINT_F。因此,我认为Flyway不再是问题,仅与H2有关。

有人对此有任何线索吗?谢谢大家!

1 个答案:

答案 0 :(得分:1)

这实际上是H2上的一个错误,基于H2的开发者之一Katzyn,当创建自动递增类型的列时,它已经具有带有默认名称。为此,创建了一个新提交,并关闭了issue,因此我希望在下一个版本中对此进行修复。

谢谢大家!