【问题标题】:How do I create a hypertable with TimescaleDB from a table with joint Primary Key?如何从具有联合主键的表中创建具有 TimescaleDB 的超表?
【发布时间】:2021-05-26 12:23:20
【问题描述】:

这个问题几乎说明了一切。我正在尝试从具有联合主键的表中使用 TimescaleDB 创建一个超表:

CREATE TABLE cars
(
    id BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY,
    time_bought TIMESTAMP NOT NULL,
    brand VARCHAR(100),
);


ALTER TABLE cars ADD CONSTRAINT PK_id_time_bought PRIMARY KEY(id, time_bought);


SELECT create_hypertable('cars', 'time_bought');

当我尝试通过 Intellij 使用 Java 运行它时,我得到了这个错误:

SQL State  : 42883
Error Code : 0
Message    : ERROR: function create_hypertable(unknown, unknown) does not exist
  Hint: No function matches the given name and argument types. You might need to add explicit type casts.
  Position: 8
Location   : db/migration/tenants/V1__init_schema.sql (C:\example\target\classes\db\migration\tenants\V1__init_schema.sql)
Line       : 45
Statement  : SELECT create_hypertable('cars', 'time_bought')

更新:我尝试在不将任何主键放入表中的情况下运行迁移,但它仍然给出相同的错误。问题可能是 Flyway 根本不支持 TimescaleDB 函数吗?如果是这样,我该如何解决?

【问题讨论】:

  • 该问题可能与未找到该功能有关。至少我没有从上面的代码中看到错误的任何其他原因。调用\dx查看这个数据库是否安装了TimescaleDB(需要在每个数据库中安装)。您在公共架构中吗?
  • @k_rus 但是当我在 Postgres GUI (PGadmin 4) 中运行相同的功能时,它没有给出任何错误。我不在公共架构中,我在一个名为 schema_1 的架构中。
  • 您的意思是在您的环境中,在调用函数时显式提供public 架构名称不起作用?
  • @k_rus 好吧,显然不是,它有效!非常感谢,我的问题解决了。
  • 修复好了。稍后我会根据上面的讨论给出如何处理此类错误的答案。

标签: java postgresql timestamp timescaledb hypertable


【解决方案1】:

根据documentation of create_hypertable,对它的调用在我看来是正确的。因此很可能找不到任何 TimescaleDB 函数。常见的原因有:

  1. 未在数据库中创建 TimescaleDB 扩展。
  2. TimescaleDB 函数的架构与当前架构不同。

TimescaleDB 扩展是为每个数据库创建的。因此,如果它是在一个数据库中创建的,那么它在另一个数据库中将不可用。如果扩展已创建,可以使用\dx 进行检查。例如

\dx
                 List of installed extensions
  Name   | Version |   Schema   |         Description
---------+---------+------------+------------------------------
 plpgsql | 1.0     | pg_catalog | PL/pgSQL procedural language
(1 row)

create extension timescaledb;

\dx
                                       List of installed extensions
    Name     |  Version  |   Schema   |                            Description
-------------+-----------+------------+-------------------------------------------------------------------
 plpgsql     | 1.0       | pg_catalog | PL/pgSQL procedural language
 timescaledb | 2.3.0-dev | public     | Enables scalable inserts and complex queries for time-series data
(2 rows)

请注意,扩展是在架构 public 中创建的。

因此,如果会话不在同一架构中,例如public,则将找不到该函数。可以使用SELECT current_schema; 检查当前架构。如果不是同一个模式,那么应该在函数调用中提供模式名称。例如:

SELECT current_schema;
 current_schema
----------------
 test_schema
(1 row)

SELECT create_hypertable('my_table', 'time_column');
ERROR:  function create_hypertable(unknown, unknown) does not exist
LINE 1: SELECT create_hypertable('my_table', 'time_column');
               ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

SELECT public.create_hypertable('my_table', 'time_column');

【讨论】:

    猜你喜欢
    • 2020-04-25
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-15
    • 2012-03-13
    • 1970-01-01
    相关资源
    最近更新 更多