【发布时间】:2021-09-10 16:56:14
【问题描述】:
我目前正在使用 liquibase 将更改应用到 H2 和 SQL 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