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_room
的equipment
列中,我们会看到projector
的两个条目吗?【参考方案4】:
除了@harm 答案,你可以跳过引号:
INSERT INTO lecture_room (equipment) VALUES ('projector, safe');
【讨论】:
以上是关于PostgreSQL INSERT 插入一个枚举数组的主要内容,如果未能解决你的问题,请参考以下文章
获取 PostgreSQL 中受 INSERT 或 UPDATE 影响的记录数
在 PostgreSQL 数据库中插入带有 jOOQ 的 SQL 枚举
使用 Postgresql JDBC 时,将导致插入 0 行的 INSERT 语句