Перемещение данных между таблицами


В настоящее время я использую 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 2

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 это помогло мне понять запрос