【问题标题】:PostgreSQL unique index using gist使用 gist 的 PostgreSQL 唯一索引
【发布时间】:2021-04-01 09:17:27
【问题描述】:

我有一个表“locations”,其中包含“point”类型的“from”和“to”列。 我只能在这些列上使用“gist”索引,因为 b-tree 不适用于“point”类型。

我想在两列上都有一个唯一索引(以确保没有存储相同的位置)。

这是不可能的,因为错误“访问方法“gist”不支持唯一索引”。

有没有可能做到这一点?我可以通过创建存储“from_lat,from_lng:to_lat,to_lng”的常规文本列并在其上添加唯一索引来解决它,但是有更好的方法吗?

【问题讨论】:

  • 所以你想阻止具有相同fromto 值的行?
  • 是的,就是这样。

标签: postgresql indexing


【解决方案1】:

您可以使用exclusion constraint。唯一约束(或索引)本质上只是排除约束的一种特殊情况。

使用 GIST 定义排除约束:

alter table locations
  add constraint unique_points
  exclude using gist ("from" with ~=, "to" with ~=);

运算符 ~= checks 用于两点相等

【讨论】:

    【解决方案2】:

    您可以使用“排除”约束,但这根本不是唯一索引,也不是主键。此外,upsert 是不可能的,因为要解决“冲突时 (...) 更新”,需要主键或唯一键。

    引用https://www.postgresql.org/docs/13/indexes-unique.html不可能使用任何范围类型作为唯一键(或pkey,包括重叠范围等违规)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-13
      • 2018-12-02
      • 1970-01-01
      • 2020-10-01
      • 2015-04-24
      • 1970-01-01
      • 2014-01-02
      相关资源
      最近更新 更多