【问题标题】:Is it possible to create a UNIQUE index on geometric types?是否可以在几何类型上创建唯一索引?
【发布时间】:2021-09-16 20:41:36
【问题描述】:

我有一张这样的桌子

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.

我可以为索引指定一个操作符类吗?我把盒子当作别的东西吗? (如果可能,我希望这个解决方案适用于polygon)我要创建函数索引吗?

请注意,这与 PostGis 无关(除非这是唯一的方法——我什至不确定 PostGis 是否适用于几何类型)。不过,这就是我在谷歌上搜索到的所有内容。

【问题讨论】:

  • 你想要一个GIST 索引
  • 下面的答案说 btree 是唯一可以用来做唯一约束的人吗?

标签: postgresql postgresql-12 unique-index


【解决方案1】:

当前版本的 Postgres 13(以及 Postgres 12)支持内置 geometric type boxindex types brin, gist and spgist。 (没有btree 索引。)

但是这些“访问方法”(又名“索引类型”)都不支持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小提琴here

【讨论】:

  • 谢谢! (额外的字符...)
  • 如果表有很多行(例如数亿行),做某种函数索引是否有意义,使得索引本身更小? (例如postgresql.org/docs/12/indexes-expressional.html)。特别是如果我将在超过 2 列中执行此操作?非常感谢,感谢您的宝贵时间!
  • @Hoopes:我的带演员表的唯一索引只是另一个“功能索引”(= 表达式索引)。演员阵容是无损的。您可能会考虑使用哈希函数 - 以可能的哈希冲突为代价。这一切都取决于。在实际数字(表中的行、框列中的基数、预期增长/流失)上,您愿意冒哈希冲突的风险、性能特征和要求、典型查询、可用资源、读/写比率……这是一个相关的答案:dba.stackexchange.com/a/299107/3684。您可能会提出一个新问题,披露所有相关信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-11
  • 2013-01-27
  • 1970-01-01
  • 1970-01-01
  • 2015-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多