【问题标题】:Add auto increment with labeled primary key to existing table in SQL Server and H2 / Liquibase向 SQL Server 和 H2 / Liquibase 中的现有表添加带有标记主键的自动增量
【发布时间】:2021-09-10 16:56:14
【问题描述】:

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

目标:

  • 向现有表添加具有自动增量功能的列 id
  • id添加一个带有约束名称的主键约束

Liquibase 自动增量不支持 SQL Server,所以我需要在 SQL 中找到解决方案。 我想要的是这样的:

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

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

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

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

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

我将不胜感激。


编辑:

另一种尝试是拆分 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,但您不想使用它的原因有点令人困惑。你介意改写一下吗?

标签: sql sql-server h2 liquibase


【解决方案1】:

不幸的是,H2 1.4.200 还没有很好地模拟来自 SQL Server 的非标准 IDENTITY 子句,并且 SQL Server 不支持 H2 和各种其他 DBMS 支持的标准标识列(ID BIGINT GENERATED BY DEFAULT AS IDENTITY 等) .

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

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

使用编译好的快照版本,您将能够使用

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

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

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

【讨论】:

  • 我在这里学到了很多...... liquibase 不支持身份...... dbt 不支持身份。你为我节省了很多浪费的时间
猜你喜欢
  • 2011-06-19
  • 1970-01-01
  • 2012-07-12
  • 2016-09-11
  • 1970-01-01
  • 2018-10-17
  • 2011-02-26
相关资源
最近更新 更多