2017-05-09 66 views
0

我的表中有一個枚舉類型列。我現在已經決定把它變成一個varchar類型並且加上了一些限制。 Q1)這是一個很好的做法:在列上添加或放置constarint。 Q2)如何將我的枚舉類型列更改爲varchar。與此問題相反question。 我嘗試使用這樣的:在postgresql中將枚舉類型列升級到varchar

ALTER TABLE tablename ALTER COLUMN columnname TYPE VARCHAR 

但是,這給我的錯誤:No operator matches the given name and argument type(s). You might need to add explicit type casts.

這是表的定義:

CREATE TABLE tablename (
    id1 TEXT NOT NULL, 
    id2 VARCHAR(100) NOT NULL, 
    enum_field table_enum, 
    modified_on TIMESTAMP NOT NULL DEFAULT NOW(), 
    modified_by VARCHAR(100), 
    PRIMARY key (id1, id2) 
); 
+0

它適用於我。你可以用CREATE TYPE和CREATE TABLE語句擴展這個問題,這樣我就可以重現這個問題了嗎? –

+0

如果你嘗試:'ALTER TABLE tablename ALTER COLUMN columnname TYPE VARCHAR USING columnname :: text',會發生什麼?該消息表明它不能將你的enum(技術上是一個類型)轉換爲'varchar',大概是因爲枚舉不是一個簡單的類型。您可能會將某些成功類型轉換爲文字。從https://www.postgresql.org/docs/current/static/sql-altertable.html:「如果沒有隱式或從舊類型轉換爲新類型,則必須提供USING子句」。 – Manngo

+0

@manngo操作符不存在:character varying = table_enum:這是我運行建議命令時得到的錯誤。 table_enum是我的表的枚舉字段。 –

回答

2

至於最佳實踐,它是最好的,如果你定義了一個單獨的可能值表,並將列設置爲該表的外鍵。這樣做有以下好處:

  • 新表不僅具有特定的密鑰類型,它可以與細節的其他列,比如一個友好的名稱,種類或者更多信息
  • 變遷的意義可能的值是操縱記錄(INSERT,UPDATEDELETE)的問題,它比更改約束或枚舉值更易於訪問和管理。