Откат Liquibase на уникальном ограничении - PullRequest
0 голосов
/ 27 мая 2020

Я создаю набор изменений, чтобы добавить уникальное ограничение:

- changeSet:
  id: gabe_changeset_01
  changes:
  - addUniqueConstraint:
      columnNames: SUBJECT_TYPE_ID, SUBJECT_NAME
      constraintName: uk_subject_type_name
      tableName: SUBJECT

Когда уникальное ограничение содержит столбец внешнего ключа, я получаю сообщение об ошибке во время Liquibase откат .

Неожиданная ошибка при запуске Liquibase: не удается удалить индекс 'uk_subject_type_name': необходимо в ограничении внешнего ключа [Failed SQL: ALTER TABLE SUBJECT DROP KEY uk_subject_type_name]

Чтобы обойти это I добавьте следующее - rollback.

  - rollback:  
    - dropForeignKeyConstraint:
        baseTableName: SUBJECT
        constraintName: fk_subject_type_id
    -  dropUniqueConstraint:  
        constraintName:  uk_subject_type_name
        tableName:  SUBJECT
    - addForeignKeyConstraint:
        constraintName: fk_subject_type_id
        baseTableName: SUBJECT
        baseColumnNames: SUBJECT_TYPE_ID
        referencedTableName: SUBJECT_TYPE
        referencedColumnNames: ID
        onDelete: RESTRICT

- addForeignKeyConstraint скопировано из предыдущего запуска набора изменений в прошлом. Это решение выглядит как антипаттерн, потому что я нарушаю следующие рекомендуемые рекомендации:

Одно изменение на набор изменений

Насколько это возможно, избегайте множественных изменений на набор изменений, чтобы избежать неудачных операторов автоматической фиксации, которые могут оставить базу данных в неожиданном состоянии.

Ограничение внешнего ключа работало хорошо до того, как я добавил уникальное ограничение, но после того, как я добавлю уникальное ограничение, оно похоже, напрямую привязан к внешнему ключу, что не позволяет мне его удалить.

Есть ли решение, при котором мне не нужно делать это обходное решение? Было бы оптимально, если бы я мог просто полагаться на автоматический откат Liquibase, не определяя свой собственный. Может, в MySQL есть что-то, что я могу установить, чтобы обойти это?

...