[英]liquibase change primary key granularity
我需要更改表以添加列並將其包括在主鍵中。 所以我有一個luiqbase變更集:
我想知道如何分離問題並正確實施回滾。
<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並重新創建它,這可能會影響數據庫響應時間。 但是,這使得所有這些更改都是原子的。
<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.