【问题标题】:PostgreSQL: changing a column of enum typePostgreSQL:更改枚举类型的列
【发布时间】:2011-12-31 18:00:28
【问题描述】:

这是枚举类型的定义:

CREATE TYPE khstate AS ENUM ('none', 'form', 'test', 'finished');

现在,在一个数据库表中,我有一行包含“id”(SERIAL 类型)和“state”(khstate 类型)列。 “id”列的值为 100004,“state”列的值为“none”。我如何将其更改为“形式”?表定义如下。

CREATE TABLE IF NOT EXISTS khs (  
    id SERIAL UNIQUE,  
    state khstate DEFAULT 'none',  
    PRIMARY KEY (id)  
);

我尝试过诸如

之类的查询
UPDATE tablename SET state = 'form' WHERE id = 100004;  

错误:枚举 khstate 的输入值无效:“form”

UPDATE tablename SET state = 'form'::khstate WHERE id = 100004;

错误:枚举 khstate 的输入值无效:“form”

但没有成功。我用的是最新的BitNami LAPPstack,所以PostgreSQL的版本是9.1.1。

我没有添加任何 RULE 或 TRIGGER 约束,也没有明确使用事务。

我试图用谷歌搜索解决方案,但我只能找到如何更改枚举类型本身的问题,而不是列的值。

【问题讨论】:

  • 两种形式都在这里工作。编辑您的问题以包含 CREATE TABLE 语句和实际的错误消息。 (复制和粘贴;不要重新输入。)
  • 好奇 - 在执行完 UPDATE 语句后,您是否提交了事务?
  • @BobJarvis:PostgreSQL 默认以自动提交模式运行。我引用chapter "Transations" in the manual:If you do not issue a BEGIN command, then each individual statement has an implicit BEGIN and (if successful) COMMIT wrapped around it.
  • 可能的解释包括:RULETRIGGER 阻止更新。
  • @tuope:您使用的是哪个 PostgreSQL 版本?您的示例适用于 9.1

标签: postgresql enums


【解决方案1】:

错误消息表明'form' 不是您的枚举类型khstate 的注册值。

我还注意到,在您的问题中,您创建了一个名为 khs 的表,但 UPDATE 示例使用了 tablename

可能会混合使用表、模式或数据库。通过在给您错误消息的同一会话中运行此查询来诊断您的问题:

SELECT enum_range(NULL::khstate)

您在值数组中看到form 吗?我想,你不会。

更多关于enum support functions in the manual

【讨论】:

  • 非常感谢!我感到非常尴尬的是,“表单”值实际上并未列在值数组中。我打错了。 :-( 对不起“麻烦”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多