【问题标题】:Liquibase change column type from Date to DateTime without deleting contained valuesLiquibase 将列类型从 Date 更改为 DateTime 而不删除包含的值
【发布时间】:2016-09-26 08:45:14
【问题描述】:

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

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

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

我采用了以下策略

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

2- 将值从列到期日期复制到到期日期新

3- 删除列到期日期

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>

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

请问我该如何解决?

【问题讨论】:

    标签: java date datetime database-migration liquibase


    【解决方案1】:

    我在看column 文档...看来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>
    

    【讨论】:

    • 感谢 Carlitos 的回答。您提出的解决方案是我首先采用的并且有效。但我想要一种无需编写 sql 即可使用 liquibase 标签的方法。事实上,我在一家公司工作,其原则之一是编写不依赖于任何数据库的代码,因为我们使用 ORM 进行 Java 对象映射。所以我们的代码应该适用于任何 SGBD,这就是我们避免编写特定 sql 代码的原因。所以我想要一种在我的 changeSet 中只使用 liquibase 标签来解决这个问题的方法。感谢您的回答。请问你知道避免这种sql的方法吗?
    • 不是真的(我认为你不能),@blaiso ...但是,如果您编写 SQL 标准,我不明白为什么您不能使用 SQL 标记(使用 SQL 标准,您没有违反您的公司原则)...您介意接受我的回答正确吗?谢谢!
    • 好的,非常感谢 Carlitos 的回答
    猜你喜欢
    • 2011-07-08
    • 1970-01-01
    • 2018-05-29
    • 2016-09-05
    • 2020-06-19
    • 2016-08-25
    • 2018-06-03
    • 2017-08-05
    • 1970-01-01
    相关资源
    最近更新 更多