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

PostgreSQL执行SQL文件遇character(2)值过长错误求助

问题解决:PostgreSQL插入复合类型表报错"value too long for type character(2)"

错误原因

核心问题是对基于复合类型创建的表(CREATE TABLE ... OF <composite-type>)的结构理解偏差:

  • 这类表会将复合类型的每个字段拆分为表的独立列,而非包含一个复合类型的单列。
  • 你用ROW()构造了完整的复合类型值并作为单个参数传入,PostgreSQL会尝试将这个复合值的字符串表示(比如(CA,94065))转换为表的第一列state char(2),长度远超限制导致报错。
  • 最后一条embextaddr的插入语句还存在语法错误:CAST('95117' AS char(10), NULL)的括号使用错误,CAST仅接受单个目标类型参数。

修正后的SQL插入语句

将插入语句改为直接传入对应列的值,而非用ROW()包裹复合值:

-- 修正后的extaddr插入语句
INSERT INTO extaddr VALUES ('CA', '94065');
INSERT INTO extaddr VALUES ('CA', '98765');
INSERT INTO extaddr VALUES ('CA', '95117');

-- 修正后的embextaddr插入语句(修复语法错误+适配表结构)
INSERT INTO embextaddr VALUES ('CA', '95117', NULL);
-- 如果需要给preaddr字段传入具体值,可构造复合类型:
-- INSERT INTO embextaddr VALUES ('CA', '95117', ROW('NY', '10001'));

补充说明

第一个customerval的插入语句之所以成功,是因为该表的addr列本身就是address_value复合类型,因此用ROW()构造复合值传入是正确的用法;而extaddr、embextaddr这类OF <composite-type>创建的表,直接按表的列顺序传入对应类型的值即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 09:35:37