我有一个问题,一个名为updated_at的字段,用户可以自由选择要存储的日期,如果用户发送2021-08-11T21:59:59.999Z
,它将自动四舍五入为2021-08-11 22:00:00.0
,所以该字段看起来像这个
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "updated_at")
private Date updatedAt;
我读到将timestamp
更改为timestamp(3)
将解决舍入问题,所以我编写了一个Liquibase脚本,如此changeset
<changeSet id="10" author="autho2">
<modifyDataType
columnName="updated_at"
newDataType="timestamp(3)"
tableName="user_data"/>
</changeSet>
然而,我得到错误:
liquibase.exception.DatabaseException:
Invalid default value for 'updated_at' [Failed SQL:
(1067) ALTER TABLE user_data MODIFY updated_at timestamp(3)]
我做错了什么,还是错误地将日期转换为实例?
修改列定义时,必须包含要保留的所有属性:
ALTER TABLE user_data
MODIFY updated_at timestamp(3)
NULL -- if you you want it NULLable
DEFAULT CURRENT_TIMESTAMP(3) -- note this needs "(3)" too
ON UPDATE CURRENT_TIMESTAMP(3) -- if you want
补充Rick James的回答:(Rick的SQL工作起来很有魅力(
要将其与Liquibase一起使用,您可以尝试使用:
1. <changeSet id="10" author="autho2">
<sql>
ALTER TABLE user_data
MODIFY updated_at timestamp(3)
NULL -- if you you want it NULLable
DEFAULT CURRENT_TIMESTAMP(3) -- note this needs "(3)" too
ON UPDATE CURRENT_TIMESTAMP(3); -- if you want
<sql>
</changeSet>
2. <changeSet id="10" author="autho2">
<modifyDataType
columnName="updated_at"
newDataType="timestamp(3)"
tableName="user_data"/>
<modifySql>
<append value="NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)"/>
</modifySql>
</changeSet>
在运行liquibase update
之前,您可以尝试使用liquibase updateSQL
并检查输出SQL(如果是要运行的预期SQL(。