无法在timescaleDb中创建超表

问题描述 投票:0回答:2

我按照本教程的设置使用 Docker 安装了 timescaleDb:https://docs.timescale.com/self-hosted/latest/install/installation-docker/。我用了这张图片:

timescale/timescaledb-ha:pg14-latest

然后我使用 pgAdmin 连接到实例并按照官方教程进行操作:https://docs.timescale.com/getting-started/latest/tables-hypertables/.

CREATE DATABASE "test-timescale";

CREATE TABLE IF NOT EXISTS "Measurements" (
    "Id" SERIAL PRIMARY KEY,
    "DeviceId" VARCHAR(255) NOT NULL,
    "SensorId" VARCHAR(255) NOT NULL,
    "Timestamp" TIMESTAMPTZ NOT NULL,
    "Temperature" DECIMAL(10, 2)
);

但是,当我尝试运行创建超表的命令时,出现错误,指出

by_range
函数不存在

SELECT create_hypertable('Measurements', by_range('Timestamp'));

错误:

LINE 1: SELECT create_hypertable('Measurements', by_range('Timestamp...
                                                 ^
HINT: No function matches the given name and argument types. You might need to add explicit type casts. 

我检查了是否已安装并创建了 timescaleDb 扩展。还尝试将引号更改为双打,但没有成功。

我在这里缺少什么?

postgresql timescaledb
2个回答
0
投票

所以我犯了一些错误。首先,我的表以大写字母命名,这只会在 Postgresql 中带来额外的麻烦,我需要将变量用双引号括在单引号内(例如“测量”)。其次,我在

Id
中添加了一个主键约束,这使得该函数无法创建必要的表。

所以我使用了一个解决方法:

SELECT create_hypertable('measurements', 'Timestamp', if_not_exists => TRUE, chunk_time_interval => INTERVAL '1 day');

此命令现在有效,我已成功创建超表。

但是我仍然对为什么

by_range
功能不能像文档中描述的那样开箱即用。如果有人能澄清这一点,我会很高兴。


0
投票

您可能尝试在早期版本上使用 TimescaleDB 2.13+ 语法。您可以恢复到旧的。请注意区分大小写。 db<>fiddle 的演示:

alter table "Measurements" drop constraint  "Measurements_pkey";
SELECT create_hypertable('"Measurements"', 'Timestamp');

运行此程序时,

"Id"
不能是主键,因为这意味着它本身是唯一的; Timescale 要求,如果存在唯一约束,则分区键需要成为其中的一部分。

© www.soinside.com 2019 - 2024. All rights reserved.