Liquibase:在DB2中将列更改为自动递增列(标识)

时间:2019-05-29 10:23:36

标签: java spring db2 liquibase

我正在尝试将BIGINT列更改为DB2中的自动增量列,但似乎找不到方法。 我尝试这样做:

    <changeSet id="08.01" author="...">
        <addColumn tableName="table_name">
            <column name="id" type="bigint">
                <constraints nullable="true"/>
            </column>

            <column name="member_type" type="varchar(100)">
                <constraints nullable="true"/>
            </column>
        </addColumn>
    </changeSet>

    <changeSet id="08.02" author="...">
        <addAutoIncrement tableName="table_name"
                          columnDataType="bigint"
                          columnName="id"/>
    </changeSet>

当它运行时,出现此错误:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'liquibase' defined in class path resource [org/springframework/boot/autoconfigure/liquibase/LiquibaseAutoConfiguration$LiquibaseConfiguration.class]: Invocation of init method failed; nested exception is liquibase.exception.MigrationFailedException: Migration failed for change set classpath:db/changelog/08-separation.xml::08.01::author:
     Reason: liquibase.exception.DatabaseException: DB2 SQL Error: SQLCODE=-270, SQLSTATE=42997, SQLERRMC=72, DRIVER=4.13.127 [Failed SQL: ALTER TABLE SCHEMATEST.table_name ALTER COLUMN id SET GENERATED BY DEFAULT AS IDENTITY]
    at org.springframework.bean
...
...
...
Caused by: liquibase.exception.MigrationFailedException: Migration failed for change set classpath:db/changelog/08separation.xml::08.01::author:
     Reason: liquibase.exception.DatabaseException: DB2 SQL Error: SQLCODE=-270, SQLSTATE=42997, SQLERRMC=72, DRIVER=4.13.127 [Failed SQL: ALTER TABLE SCHEMATEST.table_name ALTER COLUMN id SET GENERATED BY DEFAULT AS IDENTITY]
...
...
...
Caused by: com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-270, SQLSTATE=42997, SQLERRMC=72, DRIVER=4.13.127

2 个答案:

答案 0 :(得分:2)

标识列不能为空,这就是error message tells you

  

可为空的列不能更改为标识            列。

我想将列约束更改为nullable="false"

答案 1 :(得分:0)

我自己在this link找到了答案,其解释是这样的:

  

每个DB2管理员迟早都会发现DB2无法添加   标识列轻松地存在于现有表中。以下陈述失败   由于语法错误:alter table public.clicks添加列ID整数   始终以身份产生,但我对每个人都有好消息。它   仍然可以完成,但是需要更多步骤。

  1. 添加非空整数列 您需要为其提供缺省值,否则db2将拒绝它设置为非null 更改表public.clicks添加列ID整数不为null默认值0

  2. 从列中删除默认值 我不确定为什么需要它,因为有关Internet的一些手册省略了此步骤,但是如果没有在DB2 9.7.3 LUW上使用此手册,我将无法使其工作。 更改表public.clicks更改默认列ID删除

  3. 现在将列设置为始终生成(添加自动增量) 更改表public.clicks始终以身份生成的更改列ID集

  4. 重新组织表格使其可写(我没有这样做,它仍然有效) 重新整理表格public.clicks

  5. 现在用生成的实体值替换零 更新public.clicks设置ID =默认

  6. ,还可以选择将ID列用作表的主键 更改表public.clicks添加约束pkey主键(id)

以及它的liquibase代码:

  

defaultSchemaNames来自我这样定义的spring属性。我不知道是否有更好的方法来获取模式,但是这种方法也可以

# in application.properties I've set this
liquibase.parameters.defaultSchemaName=MY_SCHEMA_NAME

liquibase.xml

    <property name="defaultSchema" value="${defaultSchemaName}" /> 

    <changeSet id="08.01.00" author="alex@mail.com">
        <dropPrimaryKey tableName="members" constraintName="pk_members_relation"/>
    </changeSet>

    <changeSet id="08.01" author="alex@mail.com">
        <addColumn tableName="members">
            <column name="id" type="BIGINT" defaultValue="0">
                <constraints nullable="false"/>
            </column>

            <column name="member_type" type="varchar(100)">
                <constraints nullable="true"/>
            </column>
        </addColumn>
    </changeSet>

    <changeSet id="08.02" author="alex@mail.com">
        <dropDefaultValue tableName="members" columnName="id"/>
    </changeSet>

    <changeSet id="08.03" author="alex@mail.com">
        <addAutoIncrement tableName="members" columnName="id" columnDataType="bigint"/>
    </changeSet>

    <changeSet id="08.04" author="alex@mail.com">
        <sql>
            UPDATE ${defaultSchema}.members SET id = default
        </sql>
    </changeSet>