Oracle 12.1中Liquibase建表报ORA-00972错误排查求助
ORA-00972: identifier is too long 异常原因分析(Liquibase + Oracle 12c R1)
这个异常的核心原因不是主键列的UUID值长度问题,而是Liquibase自动生成的主键约束名称超过了Oracle 12.1版本对标识符(约束名、表名、列名等)30字符的长度限制。
具体细节:
- 手动建表时,要么是你自己显式指定了短于30字符的主键约束名,要么是Oracle自动生成了
SYS_C00xxxxxx这类符合长度要求的系统默认约束名,所以不会触发报错。 - Liquibase默认会根据表名、列名拼接生成主键约束名,比如格式为
PK_<表名>_<列名>。如果你的表名或列名较长,拼接后的约束名很容易突破30字符限制——比如表名是USER_BUSINESS_DETAILS、主键列是USER_UUID,生成的PK_USER_BUSINESS_DETAILS_USER_UUID长度远超30,直接触发ORA-00972。
你可以通过liquibase updateSQL命令导出Liquibase实际执行的SQL语句,检查其中的主键约束名称长度,就能验证这个问题。
解决起来也简单:在Liquibase的changeSet里显式指定短于30字符的主键约束名即可,示例如下:
<changeSet id="create_user_table" author="your_name"> <createTable tableName="USER_BUSINESS_DETAILS"> <column name="USER_UUID" type="VARCHAR2(36)"> <constraints primaryKey="true" primaryKeyName="PK_USER_UUID"/> </column> </createTable> </changeSet>
内容的提问来源于stack exchange,提问作者whatamidoingwithmylife
相关产品推荐
相关产品推荐

