TimescaleDB/PostgreSQL: 创建超表时如何使用唯一约束?

TimescaleDB/PostgreSQL: how to use unique constraint when creating hypertables?

我正在尝试在 PostgreSQL 中创建一个 table 以包含大量数据,因此我想使用时间尺度 hypertable,如下例所示。

CREATE TABLE "datapoints" (
  "tstz" timestamptz NOT NULL,
  "id" bigserial UNIQUE NOT NULL,  
  "entity_id" bigint NOT NULL,
  "value" real NOT NULL,
  PRIMARY KEY ("id", "tstz", "entity_id")
);

SELECT create_hypertable('datapoints','tstz');

但是,这会引发错误 - 如下所示。据我所知,由于 hypertables 中不允许使用唯一约束,因此出现了错误,但我确实需要唯一性。那么有人知道如何解决或解决它吗?

ERROR:  cannot create a unique index without the column "tstz" (used in partitioning)
SQL state: TS103

这是无法避免的。

TimescaleDB 使用 PostgreSQL 分区,并且在不包含分区键的分区table 上不可能有主键或唯一约束。

其背后的原因是分区 table 上的索引由分区上的各个索引组成(这些是 分区索引 的分区)。现在保证这种分区索引的唯一性的唯一方法是在定义中隐含唯一性,只有当分区键是索引的一部分时才会出现这种情况。

所以你要么必须牺牲 id 的唯一性约束(如果你使用序列,这几乎是给定的),要么你必须不进行分区。