根据 dbms 插入列

Lon*_*olf 1 liquibase

我正在使用 liquibase 并且我需要支持 MSSQL 和 Oracle,但是在 MSSQL 上没有序列并且该列必须是自动递增的,对于 Oracle 我需要有一个序列。

如果没有 2 个插入,我将如何进行插入,一个是因为 Oracle 将使用序列,另一个用于 MSSQL,我将省略 id 列。遗憾的是,liquibase 的列定义不支持 dbms 参数。

Mar*_*ion 5

我们有一个类似的设置,支持 DB2(2 种风格)、Oracle 和 MS SQL Server。对于前三个,我们使用序列,但对于 SQL Server,我们使用标识列。

我现在正在将我们转移到 Liquibase(从维护四组 SQL 脚本的恐惧中),对于这种情况,我正在使用modifySql标签。因此,在每个具有 的变更集中createTable,我们遵循以下内容:

<modifySql dbms="mssql">
    <replace replace="[ID] INT" with="[ID] INT IDENTITY"/>
</modifySql>
Run Code Online (Sandbox Code Playgroud)

这会更改生成的 SQL,将[ID] INT子句替换为[ID] INT IDENTITY,从而将其变成自动递增列。

除此之外,我们dbmscreateSequence变更集中有适当的条目:

<changeSet dbms="oracle,db2,db2i" author="mccallim (generated)" id="1419011907193-1">
    <createSequence schemaName="${main.schema}" cacheSize="100" cycle="false" incrementBy="1" minValue="1" sequenceName="SEQ_ALLOWEDCURRENCIES" startValue="1"/>
</changeSet>
Run Code Online (Sandbox Code Playgroud)

更新以添加数据插入

以下是我们如何将数据添加到具有上述列的表中。这里的列HOSTGROUPID是在 MS SQL 上自动递增的。诀窍是设置一个特殊条件,允许您从脚本中插入值。我假设这就是你想要的。

<changeSet author="mccallim (generated)" id="1419001537990-22">
    <sql dbms="mssql">
        SET IDENTITY_INSERT HOSTGROUP ON;
    </sql>
    <insert tableName="HOSTGROUP">
        <column name="HOSTGROUPID" valueNumeric="1"/>
        <column name="GROUPDESCRIPTION" value="SYSTEM"/>
        <column name="CENTREID" valueNumeric="1"/>
        <column name="ARCHIVECONTROL" valueNumeric="2"/>
        <column name="ARCHIVETIME"/>
        <column name="ARCHIVEOFFSET" valueNumeric="10"/>
        <column name="ARCHIVE" valueNumeric="1"/>
        <column name="PRINTEODREPORTS" valueNumeric="0"/>
        <column name="EODREPORTTYPE"/>
        <column name="CONTROLLINGHOSTID"/>
    </insert>
    <sql dbms="mssql">
        SET IDENTITY_INSERT HOSTGROUP OFF;
    </sql>
</changeSet>
Run Code Online (Sandbox Code Playgroud)