在表之间移动数据

时间:2015-11-20 06:50:07

标签: liquibase

我目前正在我的一个小项目中使用Liquibase,它的工作非常好。 但是现在我正面临着一个问题。我的ChangeLog在我的testenv中按预期工作但在我的productiv上失败了。发生这种情况是因为我的prod-tables包含几行数据。

我知道liquibase中有一个UPDATE命令,但我不确定如何正确使用它。

我要归档的是将列从表B移动到表A而不会丢失其数据。表B包含表A的外键。正常的SQL语句看起来像update A set A.x = (select B.x from B where B.id = A.id)

如果有人能给我一个这样的更新变更集的例子,那就太好了。

THX!

2 个答案:

答案 0 :(得分:4)

可能看起来像

<changeSet ...>
    <update tableName="TABLE_A">
            <column name="x" valueComputed="(select b.x from TABLE_B b where b.id=id)"/>
    </update>
</changeset>

答案 1 :(得分:0)

如果要从多个表中获取数据,则应该有一个where子句,否则最终会将先前的更新操作覆盖为空,

换句话说,对于在xTable.newColumn中具有null键的xTable行,将no matching设置为yTable的问题

不用担心where子句会解决此问题,只需添加以下where子句:

xTable.itsId =(the same select statement in valueComputed but select Id instead)

这是一个真实的例子

<changeSet id="0.0.6.1" author="bmomani">
 .....
    <update tableName="change">
        <column name="WIDGET_ID" valueComputed="(SELECT insert_widget.WIDGET_ID FROM insert_widget WHERE change.ID = insert_widget.ID)"/>
        <where>change.id = (SELECT insert_widget.ID FROM insert_widget WHERE change.ID = insert_widget.ID)</where>
    </update>

    <update tableName="change">
        <column name="WIDGET_ID" valueComputed="(SELECT remove_widget.WIDGET_ID FROM remove_widget WHERE change.ID = remove_widget.ID)">
        </column>
        <where>change.id = (SELECT remove_widget.ID FROM remove_widget WHERE change.ID = remove_widget.ID)</where>
    </update>
    <comment>note that we can do this in one update statement if we used union</comment>

    <comment> optional to drop column</comment>
    <!--<dropColumn tableName="insert_widget" columnName="widget_id"/>-->
    <!--<dropColumn tableName="remove_widget" columnName="widget_id"/>-->
</changeSet>

在此代码段中,我想将widget_id表中的insert_widget列移动到change表中,但是change表中已经有数据,因此我必须使用update语句

在此https://stackoverflow.com/a/224807/4251431的帮助下,它帮助我确定了查询