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
相关产品推荐
相关产品推荐

