是否可以在几何类型上创建 UNIQUE 索引?

Is it possible to create a UNIQUE index on geometric types?

我有一个table喜欢

my_type | text
my_box  | box

其中 my_box 是来自 geometric typesbox 类型,而不是来自 postgis。

我想要一种方法来确保 my_type 的所有值中没有重复的框。通常,如果它是一个整数或类似的东西,我只会在两列中创建一个唯一索引。但是,当尝试在框上创建索引时,我得到

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.

我可以为索引指定一个运算符 class 吗?我是否将盒子投射为其他东西? (我希望 的解决方案适用于 polygon,如果可能的话)我是否创建函数索引?

请注意,这与 PostGis 无关(除非这是唯一的方法——我什至不确定 PostGis 是否适用于几何类型)。不过,这就是我 google 时出现的所有内容。

当前版本 Postgres 13(以及 Postgres 12)支持 index types brin, gist and spgist for the built-in geometric type box。 (没有 btree 索引。)

但是 none 这些“访问方法”(a.k.a。“索引类型”)支持 UNIQUE 约束或索引。 UNIQUE 仅针对 btree 索引实施。

您可以在值的文本表示或哈希值上创建 UNIQUE 索引。相同的 box 值有许多等效的语法变体,但是如果将 box 转换为 text,您将获得规范形式:

SELECT '((1, 1), (2, 2))'::box::text AS b1
     , '2, 2, 1, 1'::box::text AS b2;

     b1      |     b2
-------------+-------------
 (2,2),(1,1) | (2,2),(1,1)

解决方案

这个 UNIQUE、多列、表达式 (btree!) 索引应该适合您:

CREATE UNIQUE INDEX tbl_box_uni ON tbl (my_type, (my_box::text));

我没有拼出 btree,因为这是默认值。无论如何,UNIQUE 索引的唯一选择。

框的规范文本表示在未来的版本中不太可能发生变化,但我也不知道有任何保证。

要禁止任何两个具有相同 my_type 重叠 (更常见的要求!)的框,请使用 exclusion constraint。参见:

这要严格得多,但排除了完全重复的内容。

db<>fiddle here