1 回答

TA貢獻2011條經驗 獲得超2個贊
也許我錯過了一些東西,但據我了解,這diff
并不是萬能的工具,可以免除您的任何責任。
在某些情況下,您必須自己編寫變更集,我認為這就是其中之一。
既然它diff
確實是一個非常強大的命令,它也有它的缺點。
理論上,差異工具還可以檢查數據庫之間的新數據、更新數據和丟失數據,但實際上這不起作用,原因有兩個:
表現。隨著數據集的增長,要比較的信息量也會不斷增加,直至無法管理。
更改數據。在開發過程中,測試數據通常會添加到開發數據庫中,而這些數據不應復制到其他數據庫中。此外,新數據可能會添加到測試和生產數據庫中,但不應僅僅因為開發數據庫中不存在這些數據而將其刪除。
對于你的情況,我會做這樣的事情:
創建一個新表
phone
添加欄目
person.phone_id
將數據從 復制
person.phone_number
到phone.phone_number
將數據從 復制
phone.id
到person.phone_id
person
在和之間創建外鍵約束phone
降低
person.phone_number
代碼可能是這樣的:
<createTable tableName="phone">
? ? <column name="id" autoIncrement="true" type="bigserial">
? ? ? ? <constraints primaryKey="true" primaryKeyName="pk_phone"/>
? ? </column>
? ? <column name="phone_number" type="varchar(30)"/>
? ? <column name="brand" type="varchar(255)"/>
</createTable>
<addColumn tableName="person">
? ? <column name="phone_id" type="bigserial"/>
</addColumn>
<update tableName="phone">
? ? <column name="phone_number" valueComputed="(select p.phone_nubmer from person p)"/>
</update>
<comment>Assuming that person.phone_number is unique</comment>
<update tableName="person">
? ? <column name="phone_id" valueComputed="(select p.id from person p where p.phone_number = phone_number)"/>
</update>
<addForeignKeyConstraint baseTableName="person" baseColumnNames="phone_id"
? ? constraintName="person_phone_id_phone_id_fk"
? ? referencedTableName="phone" referencedColumnNames="id"/>
<dropColumn tableName="person" columnName="phone_number"/>
添加回答
舉報