2017-05-09 82 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)的问题,它比更改约束或枚举值更易于访问和管理。