22

我怎样才能插入一个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.
4

4 回答 4

30

PostgreSQL 不知道如何自动将 typetext的输入转换为 type 的输入equipment。您必须将您的字符串显式声明为 type equipment

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

我用SQL Fiddle确认了这一点。

于 2013-08-14T15:00:06.500 回答
18

像 @Mark 这样正确提供的ARRAY 构造函数 的替代方法是使用字符串文字

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

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

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

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

db<>fiddle here - Postgres 14

db<>fiddle here - Postgres 9.5

sqlfiddle - Postgres 9.3

于 2013-08-14T17:06:22.887 回答
16

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

INSERT INTO lecture_room (equipment) VALUES ('{"projector", "safe"}');
于 2017-05-04T13:08:22.363 回答
13

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

INSERT INTO lecture_room (equipment) VALUES ('{projector, safe}');
于 2018-07-05T13:19:46.657 回答