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

Sur*_*ati 6 mysql database-versioning liquibase

我正在使用 liquibase 3.5.3liquibase update在 MySql 5.5 上运行命令。我在下面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>
Run Code Online (Sandbox Code Playgroud)

在触发 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_TIMESTAMPNOW()可能导致此问题的原因。

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

Dum*_*hne 6

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

<column defaultValueComputed="CURRENT_TIMESTAMP" name="Created_Time" type="TIMESTAMP"/>
Run Code Online (Sandbox Code Playgroud)


Raf*_*l M 5

这是一个奇怪的场景,由 liquibase 处理 DateTimedefaultValueComputeddefaultValueDate.

简而言之,任何以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>
Run Code Online (Sandbox Code Playgroud)

LiquibaseDataType 辅助函数