LiquiBase 变更集:如何基于另一个 table 的列构建 where 子句

LiquiBase changeset: how do build a where clause based on ANOTHER table's column

基于问题 How to build a WHERE-clause in a LiquiBase changeset,我想根据 来自不同 table[=28= 的列的值选择列的默认值].

例如,我有两个table,orderorder_history。请注意,我们也在 order_history 中的 order 中维护所有订单。订单完成后,将从 order table.

中删除

order 有一个列 'status' 但我们在 order_history 上错过了它,你可以称它为糟糕的设计。 现在如何将'status'添加到order_history,并从对应的订单中复制值 在 order table 中用于升级时的现有数据?有没有办法在 liquibase 中做到这一点?

如果orderorder_history是用外键连接的,那么你可以这样做:

<changeSet id="foo" author="bar">
    <preConditions onFail="MARK_RAN">
        <and>
            <columnExists tableName="order" columnName="status"/>
            <columnExists tableName="order_history" columnName="status"/>
        </and>
    </preConditions>
    <comment>Update order_history.status with values from order.status, where order.id = order_history.order_id</comment>
    <update tableName="order_history">
        <column name="status" valueComputed="SELECT o.status FROM order o WHERE o.id = order_id"/>
    </update>
</changeSet>

如果这些表没有连接,那么您可以在添加新列时使用 defalutValueComputed

    <addColumn tableName="odrer_history">
        <column name="status" type="varchar(255)" defaultValueComputed="some SQL query here"/>
    </addColumn>