能否为PostgreSQL内置geometric几何类型创建UNIQUE唯一索引?
问题背景
现有如下结构的数据表:
my_type | text my_box | box
其中my_box是PostgreSQL内置几何类型中的box类型,而非PostGIS提供的类型。需要实现相同my_type值下不存在重复的box值,创建联合唯一索引时遇到如下报错:
data type box has no default operator class for access method "btree" HINT: You must specify an operator class for the index or define a default operator class for the data type.
可行解决方案(无需引入PostGIS)
以下两种方案都可同时适配box、polygon等PostgreSQL内置几何类型:
方案1:基于文本转换的函数唯一索引(兼容性最优,推荐)
PostgreSQL内置几何类型的文本序列化结果可以唯一对应其几何值,不会出现同值不同文本输出的情况,可直接将几何字段强转为text后创建联合唯一索引:
-- 适配box类型 CREATE UNIQUE INDEX idx_unique_type_box ON your_table_name (my_type, (my_box::text)); -- 适配polygon类型,替换对应字段名即可 CREATE UNIQUE INDEX idx_unique_type_polygon ON your_table_name (my_type, (my_polygon::text));
该方案兼容所有支持类型强转的PostgreSQL版本,不需要额外配置。
方案2:指定hash操作符类创建唯一hash索引
PostgreSQL内置几何类型原生支持hash索引的操作符类,如果不想使用类型转换,也可以创建hash类型的唯一索引:
-- 适配box类型 CREATE UNIQUE INDEX idx_unique_type_box ON your_table_name USING hash (my_type, my_box); -- 适配polygon类型 CREATE UNIQUE INDEX idx_unique_type_polygon ON your_table_name USING hash (my_type, my_polygon);
注意:该方案仅适用于PostgreSQL 10及以上版本,10之前的版本hash索引不支持WAL持久化,异常崩溃后可能出现索引损坏。
补充说明
如果后续需要对几何字段做空间相交、包含等查询操作,可以单独给几何字段创建GIST索引,和上面的唯一索引互不冲突。
内容的提问来源于stack exchange,提问作者Hoopes
相关产品推荐
相关产品推荐

