我在波斯格雷斯15号有一张餐桌

create table places
(
    id          bigint generated always as identity
        constraint pk_places
            primary key,
    name        varchar(128) not null,
    address     varchar(256) not null,
    region_name varchar      not null
        constraint fk_places_region_name_regions
            references regions
            on update cascade on delete restrict,
    coordinates geography(Point, 4326),
    constraint uq_places_name
        unique (name, region_name)
);

alter table places
    owner to postgres;

create index idx_places_coordinates
    on places using gist (coordinates);

我想在coordinates字段上创建一个唯一的索引,但精确值是唯一的没有什么意义,因为坐标可能指定为彼此之间的微小容差,这实际上使它们不是唯一的.问题-是否有可能构建唯一索引,例如,1个点和位于第一个1周围coordinates米半径内的另一个点将被视为1(相同)点,并反过来将变出唯一索引约束异常?

谢谢

推荐答案

您可以添加一个生成的列,其中包含该点周围的一个小缓冲区:

ALTER TABLE places ADD buf geography(Polygon,4326)
   GENERATED ALWAYS AS (st_buffer(coordinates, 0.00045, 'quad_segs=1')) STORED;

然后,可以创建一个排除约束,以防止这些缓冲区的边界框重叠:

ALTER TABLE places ADD EXCLUDE USING gist (buf WITH &&);

Postgresql相关问答推荐

为什么在PostgreSQL中CPU_INDEX_TUPLE_COST与CPU_TUPLE_COST不同

Postgres-pgloader-默认情况下,在PostgreSQL中将列名转换为小写

Jsonb[]字段中的PostgreSQL否定&q;-0.0

将CSV文件复制到临时表

在PostGreSQL中获取最近日期的项目

我应该如何更新热门表?

如何使用有限的varchar在postgres中存储单词é

Postgres 低估了导致错误查询计划的行数

是否可以在 postgresql 中添加表元数据?

在 KnexJS 中插入

PostgreSQL:在timestamp::DATE 上创建索引

DbProviderFactory 与 Npgsql?

PostgreSQL:根据排序顺序仅 Select 每个 id 的第一条记录

Heroku PGError:operator does not exist: character varying = integer

SQLAlchemy 中使用什么类型存储字节字符串?

将 PostgreSQL 配置为仅适用于 LOCALHOST 或指定的 ip + 端口

在 PL/pgSQL 中声明行类型变量

如何判断每个组中是否存在值

在 PostgreSQL 中显示正在运行的查询的全文

如何将 CSV 数据插入 PostgreSQL 数据库(远程数据库)