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
的唯一性约束(如果你使用序列,这几乎是给定的),要么你必须不进行分区。
我正在尝试在 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
的唯一性约束(如果你使用序列,这几乎是给定的),要么你必须不进行分区。