You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Liquibase 3.5.3在MySQL5.5中设置CURRENT_TIMESTAMP默认值报错求助

解决Liquibase 3.5.3 + MySQL 5.5 中TIMESTAMP默认值报错问题

这问题我之前踩过坑,根源是MySQL 5.5的特性限制和Liquibase生成SQL的细节冲突,咱们一步步来解决:

问题原因分析

  • MySQL 5.5的TIMESTAMP类型不支持精度参数(比如你写的TIMESTAMP(19)),这个特性是MySQL 5.6及以上才引入的,加了精度值直接导致数据库识别不了默认值。
  • 另外,你用的NOW()虽然在MySQL里能运行,但Liquibase在处理带精度的TIMESTAMP时,可能把CURRENT_TIMESTAMP转成了NOW(),加上不支持的精度,双重触发了错误。

解决方案

1. 修改ChangeSet的列定义

把带精度的TIMESTAMP(19)改成普通的TIMESTAMP,同时用defaultValueComputed指定默认值为CURRENT_TIMESTAMP(因为这是数据库函数,不是静态值)。示例ChangeSet代码:

<changeSet id="create_aTable" author="your_name">
    <createTable tableName="aTable">
        <column name="Id" type="INT" autoIncrement="true">
            <constraints nullable="false" primaryKey="true"/>
        </column>
        <column name="Code" type="VARCHAR(45)" nullable="true"/>
        <column name="Created_Time" type="TIMESTAMP" defaultValueComputed="CURRENT_TIMESTAMP" nullable="true"/>
    </createTable>
</changeSet>

2. 提前验证生成的SQL(推荐)

先执行liquibase updateSQL命令,查看生成的SQL语句,确保最终的CREATE TABLE语句是这样的:

CREATE TABLE aTable (
    Id INT AUTO_INCREMENT NOT NULL,
    Code VARCHAR(45) NULL,
    Created_Time TIMESTAMP DEFAULT CURRENT_TIMESTAMP NULL,
    CONSTRAINT PK_ATABLE PRIMARY KEY (Id)
)

确认没有TIMESTAMP(19)和NOW()的写法,这样MySQL 5.5就能正确识别默认值了。

3. 特殊场景:必须用带精度的时间类型(不推荐)

如果业务硬要带精度,那只能升级MySQL到5.6及以上版本;或者换成DATETIME类型,但MySQL 5.5的DATETIME不支持直接用CURRENT_TIMESTAMP当默认值,得自己写触发器实现,反而更麻烦,所以优先推荐前面的方案。

内容的提问来源于stack exchange,提问作者Suraj Prajapati

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:18:18