Liquibase脚本中主键列OWNER可空报错,如何修正为非空属性?
问题原因
Liquibase会按照变更集的编写顺序依次执行,单个变更集内部的操作也会按从上到下的顺序执行。报错的核心原因是:
- 首个变更集内部先创建了可空的OWNER列,紧接着就执行添加主键的操作,主键要求所有包含的列都非空,因此执行到
addPrimaryKey步骤时直接报错 - 你添加的非空约束变更集排在首个变更集之后,错误发生时后续变更集根本没有执行机会,因此不生效
解决方案
分两种场景处理:
场景1:原变更集未在任何环境执行
直接修改首个变更集的OWNER列配置,添加非空约束即可:
<changeSet author="sharakab" id="ALERT_WF:CREATE"> <createTable catalogName="${rec_owner}" tableName="ALERT_WF" tablespace="${table_space_rec_data}"> <!-- 其他列保持不变 --> <column name="OWNER" type="VARCHAR2(200 CHAR)"> <constraints nullable="false" /> </column> <!-- 其他列保持不变 --> </createTable> <addPrimaryKey catalogName="${rec_owner}" columnNames="ALERT_ID,STATUS,VERSION,STATUS_CHANGE_DATE,OWNER,REVIEWER_GRP_DISP_ID" constraintName="PK_ALERT_WF" tableName="ALERT_WF" tablespace="${table_space_rec_index}"/> </changeSet>
场景2:原变更集已在部分环境执行(不可直接修改原变更集内容)
需要调整变更集的执行逻辑,步骤如下:
- 修改原有首个变更集,删除其中的
addPrimaryKey节点,同时添加<validCheckSum>ANY</validCheckSum>绕过Liquibase的变更集内容校验,避免已执行过该变更集的环境报错 - 新增第一个变更集,给OWNER列添加非空约束
- 新增第二个变更集,执行添加主键的操作
三个变更集的示例代码如下:
调整后的原变更集
<changeSet author="sharakab" id="ALERT_WF:CREATE"> <validCheckSum>ANY</validCheckSum> <createTable catalogName="${rec_owner}" tableName="ALERT_WF" tablespace="${table_space_rec_data}"> <!-- 所有列保持原有配置不变 --> </createTable> <!-- 删掉原来的addPrimaryKey节点 --> </changeSet>
新增非空约束变更集
<changeSet id="ALERT_WF::add_non_null_constraint" author="sharakab"> <addNotNullConstraint catalogName="${rec_owner}" columnDataType="VARCHAR2(200 CHAR)" columnName="OWNER" tableName="ALERT_WF" /> </changeSet>
新增主键变更集
<changeSet id="ALERT_WF::add_primary_key" author="sharakab"> <addPrimaryKey catalogName="${rec_owner}" columnNames="ALERT_ID,STATUS,VERSION,STATUS_CHANGE_DATE,OWNER,REVIEWER_GRP_DISP_ID" constraintName="PK_ALERT_WF" tableName="ALERT_WF" tablespace="${table_space_rec_index}"/> </changeSet>
内容的提问来源于stack exchange,提问作者Akash Sharma
相关产品推荐
相关产品推荐

