是否可以在几何类型上创建 UNIQUE 索引?
Is it possible to create a UNIQUE index on geometric types?
我有一个table喜欢
my_type | text
my_box | box
其中 my_box
是来自 geometric types 的 box
类型,而不是来自 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
我有一个table喜欢
my_type | text
my_box | box
其中 my_box
是来自 geometric types 的 box
类型,而不是来自 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