簡體   English   中英

liquibase更改主鍵粒度

[英]liquibase change primary key granularity

我需要更改表以添加列並將其包括在主鍵中。 所以我有一個luiqbase變更集:

我想知道如何分離問題並正確實施回滾。

  1. 一個變更集中的addColumn和PK變更
<changeSet author="rahul" id="change_pk">
        <addColumn tableName="posts">
            <column name="aux_id" type="INT" defaultValue="0"/>
        </addColumn>
        <dropPrimaryKey tableName="posts"/>
        <addPrimaryKey tableName="posts" columnNames="id,aux_id"/>
        <rollback>
          <dropPrimaryKey tableName="posts"/>
          <addPrimaryKey tableName="posts" columnNames="id"/>
        </rollback>
    </changeSet>

這種方法讓我擔心的是,如果我無法創建列,則假定表很大,我將刪除PK並重新創建它,這可能會影響數據庫響應時間。 但是,這使得所有這些更改都是原子的。

  1. 將PK更改移至其他更改集
<changeSet author="rahul" id="add_col">
        <addColumn tableName="posts">
            <column name="aux_id" type="INT" defaultValue="0"/>
        </addColumn>
</changeSet>
<changeSet author="rahul" id="change_pk">
        <dropPrimaryKey tableName="posts"/>
        <addPrimaryKey tableName="posts" columnNames="id,aux_id"/>
        <rollback>
          <dropPrimaryKey tableName="posts"/>
          <addPrimaryKey tableName="posts" columnNames="id"/>
        </rollback>
</changeSet>

這樣,我將能夠更好地控制PK更改的回滾,這將刪除並重新創建舊的PK。 但是,有一個問題,當未應用change_pk變更集時-我有一列,應該包含在PK中,但事實並非如此,這會使系統容易受到唯一性約束違例的影響。

您可以使用runAlways屬性執行以下操作。 另外,請檢查不同的onFail選項

<changeSet author="rahul" id="add_col" runAlways="true">
    <preConditions (perhaps, some non-default onFail option) >
        <not>
            <columnExists tableName="posts" columnName="aux_id"/>
        </not>
    </preConditions>
    <addColumn tableName="posts">
        <column name="aux_id" type="INT" defaultValue="0"/>
    </addColumn>
</changeSet>

<changeSet author="rahul" id="change_pk">
    <preConditions>
        <and>
            <columnExists tableName="posts" columnName="aux_id"/>
            <!-- perhaps some other precondition --> 
            <sqlCheck expectedResult="id">
                SELECT key_column_usage.column_name
                FROM   information_schema.key_column_usage
                WHERE  table_schema = SCHEMA()     
                AND    constraint_name = 'PRIMARY' 
                AND    table_name = 'posts' 
            </sqlCheck>
        </and>
    </preConditions>
    <dropPrimaryKey tableName="posts"/>
    <addPrimaryKey tableName="posts" columnNames="id,aux_id"/>
    <rollback>
        <dropPrimaryKey tableName="posts"/>
        <addPrimaryKey tableName="posts" columnNames="id"/>
        <dropColumn tableName="posts" columnName="aux_id">
    </rollback>
</changeSet>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM