根据 dbms 插入列
Insert column depending on dbms
我正在使用 liquibase,我需要支持 MSSQL 和 Oracle,但是在 MSSQL 上没有序列并且列必须是自动递增的,对于 Oracle 我需要有一个序列。
如果没有其中的 2 个,我将如何进行插入,一个是因为 Oracle 将使用序列,另一个是用于 MSSQL,其中我将省略 id 列。遗憾的是,liquibase 的列定义不支持 dbms 参数。
我们这样做的方法是有两个不同的变更集。一个用于 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>
我们有类似的设置,支持 DB2(2 种风格)、Oracle 和 MS SQL Server。对于前三个,我们使用序列,但对于 SQL 服务器,我们使用标识列。
我正在将我们转移到 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>
已更新添加数据插入
以下是我们如何将数据添加到 table 中,其中包含与上述类似的列。这里列 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>
我正在使用 liquibase,我需要支持 MSSQL 和 Oracle,但是在 MSSQL 上没有序列并且列必须是自动递增的,对于 Oracle 我需要有一个序列。
如果没有其中的 2 个,我将如何进行插入,一个是因为 Oracle 将使用序列,另一个是用于 MSSQL,其中我将省略 id 列。遗憾的是,liquibase 的列定义不支持 dbms 参数。
我们这样做的方法是有两个不同的变更集。一个用于 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>
我们有类似的设置,支持 DB2(2 种风格)、Oracle 和 MS SQL Server。对于前三个,我们使用序列,但对于 SQL 服务器,我们使用标识列。
我正在将我们转移到 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>
已更新添加数据插入
以下是我们如何将数据添加到 table 中,其中包含与上述类似的列。这里列 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>