Перемещение данных между таблицами
В настоящее время я использую 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 это помогло мне понять запрос