如何从 Liquibase 中的现有列添加具有默认值的新列
How to add new column with default value from existing column in Liquibase
我使用的是 Postgres 数据库,而对于迁移,我使用的是 Liquibase。
我有一个包含以下列的订单 table:
ID | DATE | NAME | CREATOR | ...
我需要添加一个新列来保存最后修改订单的用户 - 此列应该不可为 null,并且应该具有默认值,即 CREATOR。
对于新订单,我可以解决业务逻辑的默认值部分,但是问题是我已经有一个现有订单,我需要在创建新列时设置默认值。
现在,我知道我可以设置一个硬编码的 default value in Liquibase - 但是有没有一种方法可以根据 table (对于每个实体)的其他列添加默认值。
您可以使用 defaultValueComputed
属性,它采用过程或函数的名称。您还必须创建一个创建过程的变更集。
可能看起来是这样的:
<changeSet author="steve" id="createProcedureForDefaultValue">
<createProcedure procedureName="myCoolProc">
CREATE OR REPLACE PROCEDURE myCoolProc IS
BEGIN
-- actual logic here
END;
</createProcedure>
</changeSet>
<changeSet author="steve" id="addDefaultValueColumn">
<addColumn tableName="ORDERS">
<column name="LAST_MODIFIED_BY" type="VARCHAR" defaultValueComputed="myCoolProc">
<constraints nullable="false"/>
</column>
</addColumn>
</changeSet>
或者,您可以使用 <sql>
标签执行此操作。
由于这里没有人回答,所以我发布了我的处理方式:
<changeSet id="Add MODIFY_USER_ID to ORDERS" author="Noam">
<addColumn tableName="ORDERS">
<column name="MODIFY_USER_ID" type="BIGINT">
<constraints foreignKeyName="ORDERS_MODIFY_FK" referencedTableName="USERS" referencedColumnNames="ID"/>
</column>
</addColumn>
</changeSet>
<changeSet id="update the new MODIFY_USER_ID column to get the CREATOR" author="Noam">
<sql>update ORDERS set MODIFY_USER_ID = CREATOR</sql>
</changeSet>
<changeSet id="Add not nullable constraint on MODIFY_USER_ID column" author="Noam">
<addNotNullConstraint tableName="ORDERS" columnName="MODIFY_USER_ID" columnDataType="BIGINT"/>
</changeSet>
我已经按照文档的建议在三个不同的变更集中完成了这项工作
你可以试试这个:
<column name="columnName" type="VARCHAR(255 BYTE)" defaultValue="def_value" value="def_value">
此致,
L.
我使用的是 Postgres 数据库,而对于迁移,我使用的是 Liquibase。 我有一个包含以下列的订单 table:
ID | DATE | NAME | CREATOR | ...
我需要添加一个新列来保存最后修改订单的用户 - 此列应该不可为 null,并且应该具有默认值,即 CREATOR。 对于新订单,我可以解决业务逻辑的默认值部分,但是问题是我已经有一个现有订单,我需要在创建新列时设置默认值。 现在,我知道我可以设置一个硬编码的 default value in Liquibase - 但是有没有一种方法可以根据 table (对于每个实体)的其他列添加默认值。
您可以使用 defaultValueComputed
属性,它采用过程或函数的名称。您还必须创建一个创建过程的变更集。
可能看起来是这样的:
<changeSet author="steve" id="createProcedureForDefaultValue">
<createProcedure procedureName="myCoolProc">
CREATE OR REPLACE PROCEDURE myCoolProc IS
BEGIN
-- actual logic here
END;
</createProcedure>
</changeSet>
<changeSet author="steve" id="addDefaultValueColumn">
<addColumn tableName="ORDERS">
<column name="LAST_MODIFIED_BY" type="VARCHAR" defaultValueComputed="myCoolProc">
<constraints nullable="false"/>
</column>
</addColumn>
</changeSet>
或者,您可以使用 <sql>
标签执行此操作。
由于这里没有人回答,所以我发布了我的处理方式:
<changeSet id="Add MODIFY_USER_ID to ORDERS" author="Noam">
<addColumn tableName="ORDERS">
<column name="MODIFY_USER_ID" type="BIGINT">
<constraints foreignKeyName="ORDERS_MODIFY_FK" referencedTableName="USERS" referencedColumnNames="ID"/>
</column>
</addColumn>
</changeSet>
<changeSet id="update the new MODIFY_USER_ID column to get the CREATOR" author="Noam">
<sql>update ORDERS set MODIFY_USER_ID = CREATOR</sql>
</changeSet>
<changeSet id="Add not nullable constraint on MODIFY_USER_ID column" author="Noam">
<addNotNullConstraint tableName="ORDERS" columnName="MODIFY_USER_ID" columnDataType="BIGINT"/>
</changeSet>
我已经按照文档的建议在三个不同的变更集中完成了这项工作
你可以试试这个:
<column name="columnName" type="VARCHAR(255 BYTE)" defaultValue="def_value" value="def_value">
此致, L.