You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向PostgreSQL表的自定义类型数组列插入数据?

自定义类型数组的数据插入方案

先看你创建的自定义类型与数据表:

CREATE TYPE mercadoria AS (
    codigo int,
    preco decimal,
    icms decimal
);

CREATE TYPE item_pedido AS (
    numeroItem int,
    quantidade decimal,
    desconto decimal,
    mercadoria mercadoria
);

CREATE TABLE pedido (
    codCliente int references cliente(codigo),
    codigo int primary key,
    data_pedido Date,
    data_entrega Date,
    itemPedido item_pedido[]
);

你尝试的插入代码无法运行,问题出在数组构造逻辑错误,嵌套类型也未明确指定,导致数据库无法正确解析。以下是两种可行的插入方法:

方法一:用ARRAY构造器+显式类型转换

这是最清晰的写法,明确指定每个嵌套类型的类型:

INSERT INTO pedido VALUES (
    32,
    1,
    '2023-01-01',
    '2023-01-02',
    ARRAY[
        ROW(1, 2.5, 0.2, ROW(2, 33.3, 5.67)::mercadoria)::item_pedido,
        ROW(1, 2.5, 0.2, ROW(6, 7.3, 0.7)::mercadoria)::item_pedido,
        ROW(1, 2.5, 0.2, ROW(9, 10.6, 15.89)::mercadoria)::item_pedido
    ]
);

方法二:用字符串格式的数组表示

如果习惯字符串写法,可以直接用带类型转换的字符串数组:

INSERT INTO pedido VALUES (
    32,
    1,
    '2023-01-01',
    '2023-01-02',
    '{
        "(1,2.5,0.2,(2,33.3,5.67))",
        "(1,2.5,0.2,(6,7.3,0.7))",
        "(1,2.5,0.2,(9,10.6,15.89))"
    }'::item_pedido[]
);

错误原因说明

  • 原代码给数组外层多套了ROW(),PostgreSQL的数组不需要用ROW包裹,直接用ARRAY[]或者字符串数组即可。
  • 嵌套自定义类型时,显式添加::mercadoria和::item_pedido类型转换,能避免数据库因类型推导模糊而报错。

内容的提问来源于stack exchange,提问作者Matheus Henriques

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 22:33:25