2013-03-27 58 views
13

我們在表中有一個varchar列,我們需要升級到枚舉類型。在postgresql中將varchar列升級爲枚舉類型

varchar列中的所有值都是枚舉中的有效值。 varchar列中沒有空值。

ALTER TABLE tableName 
    ALTER COLUMN varcharColumn TYPE enum_type 

錯誤:列 「varcharColumn」 不能轉換爲enum_type SQL狀態類型:42804

大約方式的輪是

  1. 創建枚舉類型另一個新列。
  2. 在類型轉換之後使用varchar列更新枚舉類型列。
  3. 刪除varchar列。
  4. 將枚舉類型列名重命名爲varchar列名。

有沒有更好的方法來實現這一目標?

在此先感謝。

回答

24

您需要定義要使用的轉換,因爲沒有默認轉換可用。

如果varcharColumn所有值符合枚舉的定義,下面應該工作:

alter table foo 
    ALTER COLUMN varcharColumn TYPE enum_type using varcharColumn::enum_type; 

我個人不喜歡枚舉,因爲他們是相當不易伸縮。如果我想限制列中的值,我更喜歡varchar列的檢查約束。或者 - 如果值列表經常變化並且將會增長 - 帶有外鍵約束的舊的「查找表」。

+0

當使用某些客戶端應用程序而不是查找表或簡單的約束列時,枚舉也會產生更多問題。因爲任何在JPA/Hibernate中使用枚舉的可疑人員都知道。 – 2013-03-27 11:12:49

+0

謝謝a_horse_with_no_name!儘管我從文檔中找到了解決方案,但您的解釋非常全面和有用。 – Gopal 2013-03-27 11:34:25

+0

我最近需要通過將枚舉移動到模式來重新組織枚舉,這對他們來說更有意義。因此,依賴枚舉的表需要將其類型「更改」爲指向枚舉的新位置。我做了如下,雙重演員:'alter table my_schema.my_column改變列sale_item_status類型my_schema.my_column_enum 使用((my_column :: text):: my_schema.my_column_enum) - HTH任何其他人與枚舉「問題「 – 2013-10-24 23:21:49

3

明白了。

ALTER TABLE tableName 
    ALTER COLUMN varcharColumn TYPE enum_type 
    USING varcharColumn::enum_type 

將更新成功。