根据dbms插入列

时间:2015-02-25 13:50:17

标签: liquibase

我正在使用liquibase,我需要支持MSSQL和Oracle,但是在MSSQL上没有序列,列必须是自动增量,对于Oracle我需要有序列。

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

2 个答案:

答案 0 :(得分:2)

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

我刚才正在将我们转移到Liquibase(从维护四组SQL脚本的恐怖),对于这种情况,我使用modifySql标签。因此,在每个包含createTable的变更集中,我们会按照以下内容进行操作:

<modifySql dbms="mssql">
    <replace replace="[ID] INT" with="[ID] INT IDENTITY"/>
</modifySql>

更改生成的SQL,将[ID] INT子句替换为[ID] INT IDENTITY,将其转换为自动增量列。

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

<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>

已更新以添加数据插入

以下是我们如何使用如上所述的列向表中添加数据。这里的列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>

答案 1 :(得分:0)

我们这样做的方法是拥有两个不同的变更集。一个用于oracle,一个用于所有其他dbms类型(在我们的例子中,它只是mySQL):

<changeSet author="john" id="common-1_0-1a" dbms="oracle">
    <createSequence sequenceName="hibernate_sequence"
        startValue="1" incrementBy="1" />
</changeSet>

<changeSet author="bob" id="common-1_0-1b">
    <preConditions>
        <not><dbms type="oracle"/></not>
    </preConditions>
    <createTable tableName="hibernate_sequence">
        <column name="next_val" type="BIGINT" />
    </createTable>
    <insert tableName="hibernate_sequence">
        <column name="next_val" valueNumeric="1" />
    </insert>
</changeSet>