SuperAPI AI 工具集

postgres-syntax-arrays-ranges

数据与分析

查看项目

更新于 10-15 22:18

技能介绍

用途:指导在 PostgreSQL 中使用两种原生多值类型。数组(int[]、text[])在一列内保存有序列表,替代逗号分隔的文本;范围类型把一段区间 [lower, upper) 作为单个值存储,自带重叠与包含逻辑。

主要能力与规则:列表一律用原生数组,不用文本列存 CSV,因为字符串无法索引、校验或按元素检索;规模化执行范围重叠(&&)查询前必须建 GiST 索引或 EXCLUDE USING gist 约束,否则规划器逐行顺序扫描。数组下标从 1 开始,范围边界默认 [),即下界包含、上界不包含,两点都是关键默认值。

使用方式:需要一行多值时用数组列加 GIN 索引;建模起止区间用范围类型;禁止两行时间重叠用 EXCLUDE USING gist (... WITH &&);合并不相交区间用 multirange 加 range_agg。成员过滤用 @>(可走 GIN 索引),= ANY 不走索引,应改写为 tags @> ARRAY[value]。用 unnest ... WITH ORDINALITY 展开数组保留位置,array_agg 反向重建。邻接区间保持 [) 可避免边界值同时落入两段。同一资源防重叠可用 CREATE EXTENSION btree_gist; 与 EXCLUDE USING gist (room WITH =, during WITH &&),违约报 SQLSTATE 23P01。

适用场景:标签、角色 ID 等列表列;预订窗口、价格区间、有效期;防止房间、车辆、座位等共享资源重叠;合并多个区间求并集。

限制:不用于 JSON 文档或键值属性(见 jsonb 技能)、单范围生成行序列(用 generate_series)、空间几何区间(用 PostGIS)。应用侧先 SELECT 再 INSERT 检查冲突存在竞态,应由数据库约束原子保证。数组越界下标返回 NULL 而非报错。multirange 与 range_agg 自 v14 起提供。完整算子与函数表、版本标注示例、反模式详见该技能的 references 文件。