2016-05-27 58 views
-1

我正在使用Liquibase進行數據遷移。Liquibase從日期更改列日期類型而不刪除包含的值

我有一個名爲Document的表已經包含值。

我的表文檔包含列(id,名稱,dueDate)。 dueDate列的類型爲Date,我想將其類型從DATE更改爲DATETIME。

我已經採用以下策略

1-創建duedatenew類型DATETIME的新列從塔DUEDATE

2-複製值來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> 

但在第二步中執行changeset總是失敗。數據的副本總是失敗。

我該如何解決這個問題?

回答

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> 
+0

感謝Carlitos爲您的答案。你提出的解決方案是我首先採用的方法,它的工作原理。但我想要一個方法來使用liquibase標籤而不用寫sql。 事實上,我在一家公司工作,其原則之一是編寫不依賴任何DataBase的代碼,因爲我們使用ORM進行java對象映射。所以我們的代碼應該適用於任何SGBD,這就是爲什麼我們避免編寫特定的SQL代碼。所以我想在我的changeSet中只使用liquibase標籤來解決這個問題。 感謝您的回答。 請你知道一種避免這種sql的方法嗎? – blaiso

+1

不是真的(我認爲你不能),@blaiso ...但是,如果你編寫SQL標準,我不明白你爲什麼不能使用SQL標記(使用SQL標準,你不違反你的公司原則)...你介意接受我的答案是否正確?謝謝! –

+0

好的,非常感謝Carlitos的回答 – blaiso

相關問題