Liquibase 将列类型从 Date 更改为 DateTime 而不删除包含的值

bla*_*iso 3 java datetime date database-migration liquibase

我正在使用 Liquibase 进行数据迁移。

我有一个名为 Document 的表,它已经包含值。

我的表文档包含列(id、name、dueDate)。DueDate 列的类型为 Date,我想将他的类型从 DATE 更改为 DATETIME。

我采用了以下策略

1- 创建一个 DATETIME 类型的新列 Duedatenew

2- 将duedate 列中的值复制到duedatenew

3-删除列duedate

4-将duedatenew列重命名为duedate

如以下变更集中所述

  <changeSet id="task-99" author="blaise">
        <addColumn tableName="document">
            <column name="duedatenew" type="DATETIME" />
        </addColumn>
        <update tableName="document">
            <column name="duedatenew" valueComputed="(SELECT duedate FROM document)" />
        </update>
        <dropColumn tableName="document" columnName="duedate" />
        <renameColumn tableName="document" oldColumnName="duedatenew"
        newColumnName="duedate" />
</changeSet>
Run Code Online (Sandbox Code Playgroud)

但是在第二步期间变更集的执行总是失败。数据复制总是失败。

请问我该如何解决?

Car*_*Way 5

我正在看文档......似乎valueComputed应该指向一个sql函数,所以选择查询不起作用......

但是,根据this,您最好的选择是使用sql标签根据需要执行更新......例如:

<changeSet id="task-99" author="blaise">
    <addColumn tableName="document">
        <column name="duedatenew" type="DATETIME" />
    </addColumn>
    <sql>update document set duedatenew = duedate</sql>
    <dropColumn tableName="document" columnName="duedate" />
    <renameColumn tableName="document" oldColumnName="duedatenew"
    newColumnName="duedate" />
</changeSet>
Run Code Online (Sandbox Code Playgroud)

  • 不是真的(我认为你不能),@blaiso ...但是,如果你编写 SQL 标准,我不明白你为什么不能使用 SQL 标签(使用 SQL 标准,你不会违反你的公司原则)... 你介意接受我的回答是正确的吗?谢谢! (2认同)