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"/>
添加回答
举报