【问题标题】:Insert column depending on dbms根据 dbms 插入列
【发布时间】:2015-02-25 13:50:16
【问题描述】:

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

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

【问题讨论】:

    标签: liquibase


    【解决方案1】:

    我们有类似的设置,支持 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,这会将其变成自动递增列。

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

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

    【讨论】:

    • 这适用于模式,但我的主要问题是关于系统所需的一些基本数据所需的 语句,有没有简单的方法可以为多个文件制作单个文件数据库管理系统?特别是 MSSQL
    【解决方案2】:

    我们这样做的方式是拥有两个不同的变更集。一种用于 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-21
      • 1970-01-01
      • 2015-06-07
      • 1970-01-01
      • 2013-02-28
      相关资源
      最近更新 更多