当前位置: 首页 > 知识库问答 >
问题:

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

叶经略
2023-03-14

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

ID | DATE | NAME | CREATOR | ...

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

共有2个答案

黄逸清
2023-03-14

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

或者,您可以使用执行此操作

燕玉堂
2023-03-14

因为这里没有人回答,所以我贴出了我处理它的方式:

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

我已经按照留档的建议用了三种不同的变化集

 类似资料:
  • 问题内容: 我正在使用Postgres DB,对于迁移,我正在使用Liquibase。我有一个ORDERS表,其中包含以下列: 我需要添加一个新列,该列将容纳上次修改订单的用户-该列应不可为空,并且应具有默认值CREATOR。对于新订单,我可以解决业务逻辑的默认值部分, 但是 问题是我已经有一个现有订单,因此在创建新列时需要设置默认值。现在,我知道我可以在Liquibase中设置一个硬编码的默认值

  • 问题内容: 我正在寻找将列添加到默认值为0的MySQL数据库的语法 参考 问题答案: 尝试这个: 从链接到的文档中: 要在页面下方查找搜索语法,请执行以下操作: column_definition子句对ADD和CHANGE使用与CREATE TABLE相同的语法。请参见第12.1.17节“创建表语法”。 并从链接页面: 注意那里的DEFAULT这个词。

  • 问题内容: 如何在SQL Server 2000 / SQL Server 2005中的现有表中添加具有默认值的列? 问题答案: 句法: 例子: 笔记: 可选的约束名称: 如果省略,将自动生成 一个带有有趣名称的 如果您的,则 无论您是否指定,它都会自动对所有现有记录使用默认值WITH VALUES。 插入如何与默认约束一起使用: 如果将记录插入到SomeTable并且不指定SomeCol的值,则

  • 本文向大家介绍在MySQL中添加具有当前时间的新列作为默认值?,包括了在MySQL中添加具有当前时间的新列作为默认值?的使用技巧和注意事项,需要的朋友参考一下 为此,可以在MySQL中使用DEFAULT CURRENT_TIMESTAMP子句。以下是语法- 让我们首先创建一个表- 现在您可以使用insert命令在表中插入一些记录- 使用select语句显示表中的所有记录- 输出结果

  • 所以我有一个这样的avro记录(称之为v1): 我想添加一个区分大小写的字段,默认值为false(称为v2)。我的第一种方法是: 根据模式演变,这是向后和向前兼容的,因为具有新模式的读取器读取用旧写入器模式编码的记录将能够填充此字段默认值和具有旧模式的读取器将能够读取用新写入器模式编码的记录,因为它只会忽略新添加的字段。 添加此字段的另一种方法是添加默认值为null的

  • 本文向大家介绍向Pandas中的现有DataFrame添加新列,包括了向Pandas中的现有DataFrame添加新列的使用技巧和注意事项,需要的朋友参考一下 Pandas 数据框是一种二维数据结构,即,数据以表格的形式在行和列中对齐。可以使用python dict,list和series等创建它。在本文中,我们将看到如何在现有数据框中添加新列。因此,首先让我们使用pandas系列创建一个数据框。