5

问题是,当我想使用 created_at 表字段将简单的 Postgresql 表转换为 timescaledb 表或超表以进行索引时,它将显示此错误。表名是订单。这里 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_...
4

2 回答 2

8

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

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

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

更多信息:

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

于 2019-03-23T14:53:17.107 回答
2

您需要将当前主键放在表上并创建新的复合主键,如下所示:

ALTER TABLE table_name ADD PRIMARY KEY (id, created_at);

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

于 2019-09-11T16:14:06.250 回答