PostgreSQL使用自定义类型执行INSERT时出现语法错误求助
PostgreSQL自定义类型插入报错解决方法
你遇到的问题是因为使用了JSON风格的语法输入复合类型值,但PostgreSQL的复合类型有自己的输入格式规则,以下是几种正确的插入方式:
方式一:使用复合类型原生字符串格式
PostgreSQL复合类型的字符串输入需要用圆括号包裹,键与值之间用=分隔,字符串值用双引号包裹(若包含特殊字符)。修正后的INSERT语句:
INSERT INTO "foos" ("bar") VALUES ('(amount=0,display="0")') RETURNING *;
方式二:使用ROW构造器
通过ROW()函数构造复合类型值,再显式转换为foo类型,无需手动处理字符串格式:
INSERT INTO "foos" ("bar") VALUES (ROW(0, '0')::foo) RETURNING *;
注意:ROW()内的参数顺序必须和自定义类型foo的字段定义顺序(amount在前,display在后)一致。
方式三:使用类型构造函数
PostgreSQL会为自定义复合类型自动生成同名构造函数,直接传入字段值即可:
INSERT INTO "foos" ("bar") VALUES (foo(0, '0')) RETURNING *;
这种方式最直观,无需担心格式转义问题,参数顺序同样要匹配类型定义的字段顺序。
补充说明
如果display字段的值包含逗号、双引号等特殊字符,使用字符串格式时需要手动转义(比如值为a"b,c要写成'(amount=123,display="a\"b,c")'),而ROW构造器和类型构造函数则无需手动转义,使用起来更安全。
内容的提问来源于stack exchange,提问作者benhowdle89
相关产品推荐
相关产品推荐

