Да - вы должны написать предварительные условия. На каждый набор изменений. Всегда. Ваш набор изменений должен быть не более 1025 *, поэтому написание предварительных условий для них не должно быть трудным. Требуется лишь немного самоконтроля.
Нет - идентификатора changeSet недостаточно для проверки / проверки существующего состояния. Этого может быть достаточно в идеальном мире, где все работает очень гладко, ошибок нет, и никто не возится с базой данных своими грязными руками. Или кто-то может вставить какой-то другой набор изменений в центр вашего databaseChangeLog, и идеальный поток, основанный только на последовательности и идентичности наборов изменений, будет нарушен.
Но наш мир не идеален, поэтому Нет , ID changeSet недостаточно. Вам необходимы предварительные условия.
Кроме того, проверьте этот вопрос , если хотите узнать больше о том, как определяется личность набора изменений.
Чтобы ответить на Вторая часть вашего вопроса о проверке данных перед выполнением запросов вставки, обновления и удаления:
Вы всегда можете использовать тег <sqlCheck>
.
<changeSet id="foo" author="bar">
<preConditions onFail="MARK_RAN">
<sqlCheck expectedResult="0">
SELECT COUNT(*) FROM user WHERE full_name='John Doe';
</sqlCheck>
</preConditions>
<sql>
<!-- your custom SQL query here which modifies data somehow -->
</sql>
</changeSet>