代码之家  ›  专栏  ›  技术社区  ›  Ermintar

每个操作的Liquibase(迁移表数据)

  •  5
  • Ermintar  · 技术社区  · 10 年前

    我使用的是Liquibase,我需要根据另一个表中的条目在一个表插入数据(创建一个外键引用)

    Table: Entities (currently empty)
    PK id
    INT data
    
    Table: Existing_table (contains data)
    PK id
    ... data
    FK entities_id (references Entities.id)
    

    对于中的每个条目 Existing_table 我需要在中插入一个值 Entities 和更新 entities_id 在里面 现有表格(_T) ,使用创建的 Entities.id key .

    我如何才能做到这一点?

    1 回复  |  直到 10 年前
        1
  •  8
  •   Ermintar    10 年前

    找不到生成参数化循环的方法,因此使用了temopary列来存储引用的id。

    <changeSet id="add temp_column to Entities" author="">
        <addColumn tableName="Entities">
            <column name="temp_id" type="BIGINT"></column>
        </addColumn>
     </changeSet>
    
    <changeSet author="" id="insert Existing_table keys into Entities">
        <sql>
            INSERT INTO Entities(type_id, temp_id)
            select 1, id
            from Existing_table;
        </sql>
    </changeSet>
    
    <changeSet author="" id="insert entity keys into Existing_table">
        <sql>
            UPDATE Existing_table d set entity_id = ent.id
            FROM (select id, temp_id
            from Entities) ent
            where ent.temp_id = d.id;
        </sql>
    </changeSet>
    
    
    <changeSet id="drop temp_column to Entities" author="">
        <dropColumn tableName="Entities"
                    columnName="temp_id"/>
    </changeSet>
    
    
    
    <changeSet author="" id="addNotNullConstraint Existing_table-Entities">
        <addNotNullConstraint columnDataType="BIGINT"
                              columnName="entity_id"
                              tableName="Existing_table"/>
    </changeSet>