Sql 使用failOnError=";假;你总是跑步吗?

Sql 使用failOnError=";假;你总是跑步吗?,sql,database-schema,database-migration,liquibase,Sql,Database Schema,Database Migration,Liquibase,我试图在liquibase中执行以下变更集,它应该创建一个索引。如果该索引不存在,它将自动失败: <changeSet failOnError="false" author="sys" id="1"> <createIndex unique="true" indexName="key1" tableName="Table1"> <column name="name" /> </createIndex> </c

我试图在liquibase中执行以下
变更集
,它应该创建一个索引。如果该索引不存在,它将自动失败:

<changeSet failOnError="false" author="sys" id="1">
    <createIndex unique="true"  indexName="key1" tableName="Table1">
        <column name="name" />
    </createIndex>
</changeSet>

到目前为止,一切顺利。问题是,这个
变更集
不会被记录到DATABASECHANGELOG表中,因此每次运行liquibase时都会执行。根据liquibase文档,例如Nathen Voxland,我认为变更集应该在DATABASECHANGELOG表中标记为ran。相反,它根本不会被记录,正如我之前所说的,每次liquibase运行时都会执行它(并且每次都会失败)

我错过什么了吗

(我使用MySQL作为DBMS)

在Nathen Voxland给出的示例中,他推荐了一种更正确的方法,即在运行变更集之前使用检查数据库的状态


在我看来,忽视失败是个坏主意。。。。表示您不能完全控制数据库配置。。。。“failOnError”参数允许liquibase继续。构建将变更集记录为已执行状态不是一个坏主意吗?如果事实上不是因为发生了错误才这样做的话?

我完全同意你的看法,在我看来,使用先决条件也是正确的方法。毕竟,这就是我对
变更集所做的(虽然缺少uniqueConstraintExists前提条件,但这是另一个事实)。我只是偶然发现了我对
failOnError=“false”
属性的期望,我问自己所描述的行为是bug还是特性;)不幸的是,Oracle非null的先决条件对我不起作用,因为liquibase不支持检查非null列;这与st_jeff在前面的回答中的评论有关(但我没有50%的声誉来发表评论):FailOneError的另一个用例:如果您在oracle中删除一个唯一的约束,那么只有当它比约束新时,相关索引才会被删除。因此,删除约束后的drop index语句可能会导致错误,这取决于索引的使用期限。