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

时间:2018-02-14 18:10:21

标签: mysql liquibase database-versioning

我正在使用liquibase 3.5.3在MySql 5.5上运行liquibase update命令。我在changeSet下面创建了一个表格,其列为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()

有些人可以向我提供这个问题的任何解决方案或替代方案吗?

2 个答案:

答案 0 :(得分:3)

将类型添加为“TIMESTAMP”,如下所示

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

答案 1 :(得分:1)

这是一种奇怪的情况,原因是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