在 SQL Server 和 H2 / Liquibase 中的现有 table 添加带标签主键的自动增量
Add auto increment with labeled primary key to existing table in SQL Server and H2 / Liquibase
我目前正在使用 liquibase 将更改应用于 H2 和 SQL Server.
目标:
- 添加一列 id 并自动递增到现有的 table
- 向id
添加约束名称的主键约束
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.cmd
和 build.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)并且这些命令不会创建意外的主键约束。
我目前正在使用 liquibase 将更改应用于 H2 和 SQL Server.
目标:
- 添加一列 id 并自动递增到现有的 table
- 向id 添加约束名称的主键约束
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.cmd
和 build.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)并且这些命令不会创建意外的主键约束。