PostgreSQL如何不删除列将JSONB[]类型字段转换为JSONB类型
错误原因
PostgreSQL 未内置 jsonb[](PostgreSQL 原生数组,元素类型为jsonb)到 jsonb 类型的直接转换规则。你之前使用的col::jsonb属于无转换逻辑的强制类型标记,数据库无法自动映射两种类型的底层存储结构,因此抛出类型转换错误。
正确转换SQL
使用to_jsonb()函数显式将PostgreSQL原生数组转换为标准JSONB数组即可,注意table是SQL保留关键字,作为表名需要加双引号包裹:
ALTER TABLE "table" ALTER COLUMN col TYPE JSONB USING to_jsonb(col);
转换规则说明
- 原值为
NULL:转换后仍为NULL - 原值为空jsonb数组
'{}'::jsonb[]:转换后为JSONB空数组[] - 原值为非空数组(例如
ARRAY['{"a":1}'::jsonb, '{"b":2}'::jsonb]):转换后为标准JSONB数组[{"a":1},{"b":2}],元素内容与原数组完全一致。
如果你有特殊转换逻辑(例如仅取数组第一个元素作为字段值),只需要修改USING后的表达式即可,例如取首元素的写法为USING col[1]。
操作建议
大表执行字段类型修改会持有表锁,建议先在事务中执行验证,确认数据符合预期后再提交,避免异常:
BEGIN; -- 执行类型转换 ALTER TABLE "table" ALTER COLUMN col TYPE JSONB USING to_jsonb(col); -- 抽查数据校验 SELECT col FROM "table" LIMIT 20; -- 验证通过执行COMMIT,异常则执行ROLLBACK回滚 COMMIT;
内容的提问来源于stack exchange,提问作者Baptiste Arnaud
相关产品推荐
相关产品推荐

