Java 如何从Liquibase中的现有列添加具有默认值的新列

Java 如何从Liquibase中的现有列添加具有默认值的新列,java,postgresql,migration,liquibase,Java,Postgresql,Migration,Liquibase,我使用的是Postgres DB,对于迁移,我使用的是Liquibase。 我有一个包含以下列的订单表: ID | DATE | NAME | CREATOR | ... 我需要添加一个新的列,它将保存上次修改订单的用户-此列不应为空,并应具有默认值,即创建者。 对于新订单,我可以解决业务逻辑的默认值部分,但问题是我已经有一个现有订单,我需要在创建新列时设置默认值。 现在,我知道我可以设置硬编码-但是有没有一种方法可以基于该表的其他列(对于每个实体)添加默认值。您可以使用defaultValu

我使用的是Postgres DB,对于迁移,我使用的是Liquibase。 我有一个包含以下列的订单表:

ID | DATE | NAME | CREATOR | ...
我需要添加一个新的列,它将保存上次修改订单的用户-此列不应为空,并应具有默认值,即创建者。 对于新订单,我可以解决业务逻辑的默认值部分,问题是我已经有一个现有订单,我需要在创建新列时设置默认值。
现在,我知道我可以设置硬编码-但是有没有一种方法可以基于该表的其他列(对于每个实体)添加默认值。

您可以使用
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>

创建或替换过程mycolproc是
开始
--这里的实际逻辑
结束;

或者,您也可以使用
标记来完成此操作。

因为这里没有人回答,所以我将以我的处理方式发布:

<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>

更新订单集修改用户ID=创建者

我已经按照文档的建议在三个不同的更改集中完成了这项工作。

postgresql上的文档为
default子句
(在
create table
语句中)
default
子句为列定义中出现的列指定默认数据值。该值是任何无变量表达式(不允许子查询和对当前表中其他列的交叉引用)。。。我不认为liquibase有任何功能可以以任何方式添加此功能…谢谢@SteveDonie,但是过程或SQL中的WHERE子句应该是什么?我不知道WHERE子句应该是什么-您没有在问题中指定条件。我想在这里完成的主要任务是创建一个具有默认值的新列-默认值(对于表中的现有条目)应与另一列中的值相同。例如,如果我在表中已经有这样一个条目:ID=333 DATE=。。。NAME=NAME CREATOR=Steve我希望新创建的列具有值“Steve”作为默认值-对于新创建的条目-我将在业务逻辑中处理该值最终我以以下方式管理它(全部在一个变更集中):1)创建新的可为null的列2)使用标记更新新列3)在新列上添加不可为null的约束请注意