Я создаю набор изменений, чтобы добавить уникальное ограничение:
- 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 есть что-то, что я могу установить, чтобы обойти это?