相关疑难解决方法(0)

使用liquibase创建列时,如何根据现有列为该列指定值?

我有一个现有的mysql表,有两列a和b.

我现在想要在该表中添加一列c.

c应该是可空的,应该具有NULL的默认值,除了列b具有值10的那些行.其中b的值为10,c应该具有值X.

我知道使用SQL执行此操作相当简单,但我想使用liquibase执行此操作,因为liquibase是我们用于架构迁移的内容.

liquibase

16
推荐指数
3
解决办法
3万
查看次数

将不可为空的列添加到现有表失败."值"属性是否被忽略?

背景:我们有一个Grails 1.3.7应用程序,并使用Liquibase来管理我们的数据库迁移.

我试图将一个新列添加到一个非空的现有表.

我的变更集看起来像这样:

    changeSet(author: "someCoolGuy (generated)", id: "1326842592275-1") {
        addColumn(tableName: "layer") {
            column(name: "abstract_trimmed", type: "VARCHAR(455)", value: "No text") {
                constraints(nullable: "false")
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

哪个应该在每个现有行中插入值'No text',因此满足not null约束.Liquibase"添加列"文档.

但是当应用迁移更改集时,我得到以下异常:

liquibase.exception.DatabaseException: Error executing SQL ALTER TABLE layer ADD abstract_trimmed VARCHAR(455) NOT NULL: ERROR: column "abstract_trimmed" contains null values
Run Code Online (Sandbox Code Playgroud)

在我看来,它不使用'value'属性.

如果我将变更集更改为工作,如下所示我可以实现相同的目标.但我不想(也不应该)这样做.

    changeSet(author: "someCoolGuy (generated)", id: "1326842592275-1") {
        addColumn(tableName: "layer") {
            column(name: "abstract_trimmed", type: "VARCHAR(455)")
        }

        addNotNullConstraint(tableName: "layer", columnName:"abstract_trimmed", defaultNullValue: "No text")
    }
Run Code Online (Sandbox Code Playgroud)

Liquibase真的忽略了我的value属性,还是还有其他东西在我身上看不到?

我正在使用Grails 1.3.7,Database-migration插件1.0,Postgres 9.0

sql postgresql grails database-design liquibase

10
推荐指数
1
解决办法
1万
查看次数

Liquibase添加默认值而不是空约束

我对Liquibase有点陌生。我遇到了一种情况,其中一种changeSet情况是尝试先添加默认值,然后再添加默认值。

但是这里的问题是标签<addDefaultValue/><addNotNullConstraint/>标签都具有默认值属性,因此最终我最终遇到了异常。

以下是changeSet我所拥有的

<changeSet id="f3047816-2d48-4341-a4ce-deface083cea" author="MineStar" failOnError="true">
  <preConditions onFailMessage="Ignored AlterColumn for REHANDLE of table LOCATION as column does not exist or already has a NOT NULL constraint." onFail="MARK_RAN">
    <columnExists tableName="LOCATION" columnName="REHANDLE"/>
    <ext:columnIsNullable tableName="LOCATION" columnName="REHANDLE"/>
  </preConditions>
  <comment>AHS-1373: AlterColumn LOCATION.REHANDLE - nullability changed from true to false - defaultValue changed from 'null' to '0'</comment>
  <addDefaultValue columnName="REHANDLE" columnDataType="BOOLEAN" defaultValueNumeric="0" tableName="LOCATION"/>
  <addNotNullConstraint columnName="REHANDLE" defaultNullValue="0" columnDataType="BOOLEAN" tableName="LOCATION"/>
</changeSet>
Run Code Online (Sandbox Code Playgroud)

在这里我能看到的另一件奇怪的事情是,如果我重新排列了添加默认值和非null约束标签的顺序,我不会得到任何先添加非null约束然后再添加默认值的异常,如下所示。但是我不应该这样做,因为它会影响数据库中的校验和,我所能做的就是添加新changeSet的解决异常的方法。

<addNotNullConstraint columnName="REHANDLE" defaultNullValue="0" columnDataType="BOOLEAN" tableName="LOCATION"/>

<addDefaultValue …
Run Code Online (Sandbox Code Playgroud)

liquibase

4
推荐指数
1
解决办法
6951
查看次数

标签 统计

liquibase ×3

database-design ×1

grails ×1

postgresql ×1

sql ×1