PostgreSQL INSERT 插入一个枚举数组

Posted

技术标签:

【中文标题】PostgreSQL INSERT 插入一个枚举数组【英文标题】:PostgreSQL INSERT into an array of enums 【发布时间】:2013-08-16 14:17:12 【问题描述】:

如何插入array of enums? 这是我的enum

CREATE TYPE equipment AS ENUM ('projector','PAsystem','safe','PC','phone');

然后我的桌子上有一个设备数组:

CREATE TABLE lecture_room (
   id INTEGER DEFAULT NEXTVAL('lecture_id_seq')
 , seatCount int
 , equipment equipment[]
) INHERITS(venue);

这是我插入的尝试:

INSERT INTO lecture_room (building_code, floorNo,  roomNo, length, width
                        , seatCount, equipment) 
VALUES 
('IT', 4, 2, 10, 15 ,120, ARRAY['projector','PAsystem','safe']),

但它给了我以下错误:

ERROR: column "equipment" is of type equipment[] but expression is of type text[]
SQL state: 42804
Hint: You will need to rewrite or cast the expression.

【问题讨论】:

【参考方案1】:

PostgreSQL 不知道如何将text 类型的输入自动转换为equipment 类型的输入。您必须将您的字符串明确声明为equipment 类型:

ARRAY['projector','PAsystem','safe']::equipment[]

我通过SQL Fiddle 确认了这一点。

【讨论】:

【参考方案2】:

ARRAY constructorlike @Mark correctly supplied 的替代方法是使用string literal

'projector,PAsystem,safe'::equipment[]  -- cast optional

这个变体更短,一些客户端在使用 ARRAY 构造函数时存在问题,这是一个类似函数的元素。

另外,在这种情况下,演员表是可选的(为了更简洁的代码,更好的可读性)。由于字面量最初是 unknown 类型(与 ARRAY 构造函数的结果不同!),Postgres 将从目标列派生类型,一切正常。

一直都是这样 - 已针对 Postgres 9.3 或更高版本进行了测试:

dbfiddle here - Postgres 14

dbfiddle here - Postgres 9.5

sqlfiddle - Postgres 9.3

【讨论】:

【参考方案3】:

老问题,但新答案。在现代版本的 Postgres(用 9.6 测试)中,这些都不是必需的。它按预期工作:

INSERT INTO lecture_room (equipment) VALUES ('"projector", "safe"');

【讨论】:

这是自动处理重复项还是需要额外检查?例如,如果projector 已经在lecture_roomequipment 列中,我们会看到projector 的两个条目吗?【参考方案4】:

除了@harm 答案,你可以跳过引号:

INSERT INTO lecture_room (equipment) VALUES ('projector, safe');

【讨论】:

以上是关于PostgreSQL INSERT 插入一个枚举数组的主要内容,如果未能解决你的问题,请参考以下文章

获取 PostgreSQL 中受 INSERT 或 UPDATE 影响的记录数

postgresql Insert插入的几个报错

在 PostgreSQL 数据库中插入带有 jOOQ 的 SQL 枚举

使用 Postgresql JDBC 时,将导致插入 0 行的 INSERT 语句

如何将具有自定义枚举类型的数据从 csv 插入现有的 PostgreSQL 表

PostgreSql INSERT 插入数据判断数据是否存在,存在则更新,不存在则插入