Liquibase - 将 defaultValueComputed 添加为 CURRENT_TIMESTAMP 到时间戳列

Liquibase - Add defaultValueComputed as CURRENT_TIMESTAMP to timestamp column

我在 MySql 5.5 上使用 liquibase 3.5.3 到 运行 liquibase update 命令。我在 changeSet 下面创建一个 table,其中有一列为 Created_Time,默认值应为 CURRENT_TIMESTAMP

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

在触发 liquibase 命令时抛出异常 Unexpected error running Liquibase: Invalid default value for 'Created_Time' [Failed SQL: CREATE TABLE aTable (Id INT AUTO_INCREMENT NOT NULL, Code VARCHAR(45) NULL, Created_Time TIMESTAMP(19) DEFAULT NOW() NULL, CONSTRAINT PK_ATABLE PRIMARY KEY (Id))]

Liquibase 正在将 CURRENT_TIMESTAMP 转换为 NOW(),这可能会导致此问题。

有人可以为我提供解决此问题的任何解决方案或替代方案吗?

将类型添加为 'TIMESTAMP' 如下

<column defaultValueComputed="CURRENT_TIMESTAMP" name="Created_Time" type="TIMESTAMP"/>

这是一个奇怪的场景,由 liquibase 如何处理 DateTime defaultValueComputeddefaultValueDate

简而言之,任何以 current_timestamp 开头的内容或目标引擎上用于获取当前时间戳的默认函数都将仅默认替换 *整个字符串*函数调用忽略了您输入的任何其他内容。

我们最终得到了这样的结果:

            <column name="created_at" type="datetime"
                defaultValueComputed="NOW()">
                <constraints nullable="false" />
            </column>
            <column name="updated_at" type="datetime"
                defaultValueComputed="NOW() ON UPDATE NOW()">
                <constraints nullable="false" />
            </column>

LiquibaseDataType helper function