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,order和order_history。请注意,我们也在 order_history 中的 order 中维护所有订单。订单完成后,将从 order table.
中删除
order 有一个列 'status' 但我们在 order_history 上错过了它,你可以称它为糟糕的设计。
现在如何将'status'添加到order_history,并从对应的订单中复制值
在 order table 中用于升级时的现有数据?有没有办法在 liquibase 中做到这一点?
如果order
和order_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>
基于问题 How to build a WHERE-clause in a LiquiBase changeset,我想根据 来自不同 table[=28= 的列的值选择列的默认值].
例如,我有两个table,order和order_history。请注意,我们也在 order_history 中的 order 中维护所有订单。订单完成后,将从 order table.
中删除order 有一个列 'status' 但我们在 order_history 上错过了它,你可以称它为糟糕的设计。 现在如何将'status'添加到order_history,并从对应的订单中复制值 在 order table 中用于升级时的现有数据?有没有办法在 liquibase 中做到这一点?
如果order
和order_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>