我目前正在我的一个小项目中使用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!
答案 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的帮助下,它帮助我确定了查询