如何使用 created_at 将简单的 postgresql 表转换为 hypertable 或 timescale db 表进行索引

Sum*_*Das 3 postgresql timescaledb

问题是,当我想使用 created_at 表字段将简单的 Postgresql 表转换为 timescaledb 表或 hypertable 进行索引时,它将显示此错误。表名是订单。这里 cas_admin_db_new 是数据库名称。

我已经尝试了所有可能的方法。如下所示,但订单表不会转换为超表。

SELECT create_hypertable('orders','created_at', chunk_time_interval => 6040800000000);
ERROR: cannot create a unique index without the column "created_at" (used in partitioning)

SELECT create_hypertable('public.orders','created_at', chunk_time_interval => 6040800000000);
ERROR: cannot create a unique index without the column "created_at" (used in partitioning)

cas_admin_db_new=# SELECT create_hypertable('public.orders','created_at', chunk_time_interval => 6040800000000, created_default_indexes=>FALSE);
ERROR: function create_hypertable(unknown, unknown, chunk_time_interval => bigint, created_default_indexes => boolean) does not exist

cas_admin_db_new=# SELECT create_hypertable('"ORDER"','created_at', chunk_time_interval => 6040800000000);
ERROR: relation "ORDER" does not exist
LINE 1: SELECT create_hypertable('"ORDER"','created_at', chunk_time_...
Run Code Online (Sandbox Code Playgroud)

Mik*_*man 7

时标人在这里。问题是您的架构可能将其他一些列列为主键(或 UNIQUE 索引)。

TimescaleDB 要求任何 PK/唯一索引包括所有分区键,在您的情况下是 created_at。

那是因为我们做了这种繁重的底层分区,并且不想构建全局查找结构来确保我们已经用于分区之外的唯一性。

更多信息:

https://docs.timescale.com/timescaledb/latest/how-to-guides/schema-management/indexing/##best-practices

  • @mike那么在这个约束下,如何能有一个唯一的列被另一个表用作外键呢? (2认同)

小智 6

您需要删除表中当前的主键并创建新的复合主键,如下所示:

ALTER TABLE table_name ADD PRIMARY KEY (id, created_at);
Run Code Online (Sandbox Code Playgroud)

但有一个问题:不幸的是 ActiveRecord 不支持复合主键。

  • 这是没有意义的,使用该索引没有任何东西可以阻止插入具有相同 id 但不同时间戳的两行。 (5认同)