Liquibase: измените столбец на столбец автоинкремента (идентификатор) в DB2 - PullRequest
1 голос
/ 29 мая 2019

Я пытаюсь изменить столбец 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 ]

2 голосов
/ 29 мая 2019

Столбец идентификаторов не может иметь значение NULL, это то, что сообщается вам в сообщении об ошибке :

Столбец NULL не может быть изменен, чтобы стать столбцом идентификаторов.

Изменить ограничение столбца на nullable="false" Я думаю.

0 голосов
/ 30 мая 2019

Я сам нашел ответ на по этой ссылке , и объяснение таково:

Каждый администратор DB2 рано или поздно обнаруживает, что DB2 не может добавить Идентичные столбцы к существующей таблице легко. Следующие заявления не удается из-за синтаксической ошибки: изменить таблицу public.clicks добавить столбец id целое число генерируется всегда как личность Но у меня есть хорошие новости для всех. Это еще можно сделать, но для этого нужно выполнить больше шагов.

  1. Добавить не нулевое целое число столбец Вам нужно указать для него значение по умолчанию, иначе db2 откажется сделать его ненулевым изменить таблицу public.clicks добавить идентификатор столбца целое число не ноль по умолчанию 0

  2. Удалить значение по умолчанию из столбца Я не совсем уверен, зачем это нужно, потому что некоторые руководства в интернете пропускают этот шаг, но я не смог заставить его работать без этого на DB2 9.7.3 LUW Изменить таблицу public.clicks Изменить идентификатор столбца drop по умолчанию

  3. Теперь установите столбец всегда генерируемым ( добавьте автоинкремент ) Изменить таблицу public.clicks Изменить набор идентификаторов столбцов всегда генерируется как личность

  4. Переопределить таблицу, чтобы сделать ее доступной для записи (я этого не делал, и она все еще работает) переустановить таблицу public.clicks

  5. Теперь замените нули сгенерированными значениями itentity. обновить public.clicks set id = default

  6. И дополнительно сделать первичным ключом столбца id для таблицы изменить таблицу public.clicks добавить ограничение первичный ключ pkey (id)

И код жидкости для этого:

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