在 SQL Server 和 H2 / Liquibase 中的现有 table 添加带标签主键的自动增量

Add auto increment with labeled primary key to existing table in SQL Server and H2 / Liquibase

我目前正在使用 liquibase 将更改应用于 H2SQL Server.

目标:

Liquibase自增不支持SQL服务器所以我需要在SQL中寻找解决方案。 我想要的是这样的:

<sql>
    ALTER TABLE user ADD COLUMN id INT NOT NULL AUTO_INCREMENT;
</sql>

<addPrimaryKey columnNames="id" constraintName="userPK" tableName="user"/>

此语句仅在 H2 中有效,在 SQL 服务器中无效。 对于 SQL 服务器,IDENTITY 似乎是应用自动增量的命令,所以我尝试编写另一个使用 IDENTITY 的语句。

IDENTITY 的问题在于它在使用 H2 时会自动创建一个主键,这不是我想要的,因为我必须以某种方式找到并重命名它。 SQL 使用 IDENTITY 时服务器不会自动创建此主键。

控制主键的名称很重要,并且两个数据库的名称相同。

如有任何帮助,我将不胜感激。


编辑:

另一种尝试是拆分 sql 命令:

    <sql dbms="h2">
        ALTER TABLE user ADD ID INT auto_increment;
    </sql>

    <sql dbms="mssql">
        ALTER TABLE user ADD id INT IDENTITY(1, 1);
    </sql>

    <addPrimaryKey columnNames="id" constraintName="userPK" tableName="user"/>
然而,

H2 会忽略 addPrimaryKey 中的 constraintName,而是生成另一个名称。我希望名称相同,但我注意到我仍然可以使用 dropPrimaryKey 来删除它。

不幸的是,H2 1.4.200 尚未充分模拟来自 SQL 服务器的非标准 IDENTITY 子句,并且 SQL 服务器不支持标准标识列(ID BIGINT GENERATED BY DEFAULT AS IDENTITY 等)由 H2 和其他各种 DBMS 支持。

您需要从 GitHub 上可用的当前源代码编译 H2: https://github.com/h2database/h2database

h2 子目录中有 build.cmdbuild.sh 脚本。您需要使用 jar 参数(build jar./build.sh jar)为您 OS 启动一个合适的脚本。使用 Java 8 或 11(编译后的 jar 也将与更新的版本兼容)。

有了编译好的快照版本你就可以使用了

CREATE TABLE TEST1(ID BIGINT IDENTITY, V INT);

CREATE TABLE TEST2(V INT);
ALTER TABLE TEST2 ADD ID BIGINT IDENTITY;

和 MSSQL 服务器兼容模式下的类似命令(将 ;MODE=MSSQLServer 附加到 JDBC URL)并且这些命令不会创建意外的主键约束。