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
相关产品推荐
相关产品推荐

