错误:如果没有列“date_time”(在分区中使用),则无法创建唯一索引

2024-04-05

我刚开始使用时间刻度数据库 https://www.timescale.com/与 postgresql。我有一个名为storage_db其中包含一个名为day_ahead_prices.

安装 timescaledb 后,我正在关注从同一个 postgresql 数据库迁移 https://docs.timescale.com/latest/getting-started/migrating-data迁移我的storage_db到 timescaledb 中。

当我这样做时(包括索引):

CREATE TABLE tsdb_day_ahead_prices (LIKE day_ahead_prices INCLUDING DEFAULTS INCLUDING CONSTRAINTS INCLUDING INDEXES);
select create_hypertable('tsdb_day_ahead_prices', 'date_time');

它给了我以下错误:

ERROR:  cannot create a unique index without the column "date_time" (used in partitioning)

但是当我这样做时(排除索引):

CREATE TABLE tsdb_day_ahead_prices (LIKE day_ahead_prices INCLUDING DEFAULTS INCLUDING CONSTRAINTS EXCLUDING INDEXES);
select create_hypertable('tsdb_day_ahead_prices', 'date_time');

成功了。接下来,我做了

select create_hypertable('tsdb_day_ahead_prices', 'date_time');

它给了我以下输出:

         create_hypertable          
------------------------------------
 (3,public,tsdb_day_ahead_prices,t)
(1 row)

我对此有点陌生,所以有人可以向我解释一下它们之间有什么区别以及为什么我在第一种情况下会出错吗?

P.S.:

My day_ahead_prices看起来如下:

 id | country_code | values  |         date_time          
----+--------------+---------+----------------------------
  1 | LU           | 100.503 | 2020-04-11 14:04:30.461605
  2 | LU           | 100.503 | 2020-04-11 14:18:39.600574
  3 | DE           |  106.68 | 2020-04-11 15:59:10.223965

Edit 1:

我创建了day_ahead_prices表中python using flask and flask_sqlalchemy代码是:

class day_ahead_prices(db.Model):
    __tablename__ = "day_ahead_prices"
    id = db.Column(db.Integer, primary_key=True)
    country_code = db.Column(avail_cc_enum, nullable=False)
    values = db.Column(db.Float(precision=2), nullable=False)
    date_time = db.Column(db.DateTime, default=datetime.now(tz=tz), nullable=False)

    def __init__(self, country_code, values):
        self.country_code = country_code
        self.values = values

执行时CREATE TABLE tsdb_day_ahead_prices (LIKE day_ahead_prices INCLUDING DEFAULTS INCLUDING CONSTRAINTS INCLUDING INDEXES);你告诉数据库创建tsdb_day_ahead_prices表使用day_ahead_prices作为模板(相同的列,这些列的类型相同),但您还告诉它包含您在原始表上定义的默认值、约束和索引,并为新表应用/创建相同的值。

然后您正在执行 timescaledb 命令,该命令使tsdb_day_ahead_prices桌子 一个超表。超表是一种抽象,隐藏了物理分区 桌子。 (https://www.timescale.com/products/how-it-works https://www.timescale.com/products/how-it-works)。你在告诉 TimescaleDB 使tsdb_day_ahead_prices一个超表使用date_time列作为分区键。

创建超表时,TimescaleDB 施加的一个限制是分区列(在您的情况下为“date_time”)必须包含在该表的任何唯一索引(和主键)中。 (https://docs.timescale.com/latest/using-timescaledb/schema-management#indexing-best-practices https://docs.timescale.com/latest/using-timescaledb/schema-management#indexing-best-practices)

你得到的第一个错误cannot create a unique index without the column "date_time"正是因为如此。您复制了主键定义id柱子。所以主键是防止 该表是一个超表。

第二次,您创建了tsdb_day_ahead_prices表但你没有复制 来自原始表的索引,因此未定义主键(这实际上是唯一索引)。这样超级表就创建成功了。

从 create_hypertable 函数获得的输出告诉您,您在公共模式中拥有一个新的超级表、超级表的名称以及 timescaledb 使用的内部 ID。

所以现在你可以使用tsdb_day_ahead_prices正常情况下,下面的 timescaledb 将确保数据进入正确的分区/块

该表的 id 是否需要唯一? 如果您要保留时间序列数据 那么每一行对于每个 id 来说可能并不是真正唯一的,但可能在给定时间由 id 唯一标识。

您可以为您正在识别的项目创建一个单独的表items(id PRIMARY KEY, country_code)并让超表成为day_ahead_prices(time, value, item_id REFERENCES items(id))

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

错误:如果没有列“date_time”(在分区中使用),则无法创建唯一索引 的相关文章

随机推荐