Перемещение данных между таблицами
В настоящее время я использую Liquibase в своем небольшом проекте, который работает довольно хорошо. Но сейчас я столкнулся с проблемой. Мой список изменений работает, как и ожидалось в моем testenv, но терпит неудачу на моем productiv one. Это происходит потому, что мои prod-таблицы содержат несколько строк данных.
Я знаю, что в liquibase есть команда обновления, но я не уверен, как ее правильно использовать.
Что я хочу архивировать, так это переместить столбец из таблицы B в таблицу A без потери его данных. Таблица B содержит a внешний ключ таблицы A. обычный SQL-оператор будет выглядеть примерно так: update A set A.x = (select B.x from B where B.id = A.id)
ТХ!
2 ответа:
Это может выглядеть как
<changeSet ...> <update tableName="TABLE_A"> <column name="x" valueComputed="(select b.x from TABLE_B b where b.id=id)"/> </update> </changeset>
Если вы хотите из более чем одной таблицы, у вас должно быть предложение
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, но в таблице изменений уже есть данные, поэтому я должен использовать инструкцию updateБлагодаря этому ответу здесь https://stackoverflow.com/a/224807/4251431 это помогло мне понять запрос