ERROR: cannot create a unique index without the column "date_time" (used in partitioning)
ERROR: cannot create a unique index without the column "date_time" (used in partitioning)
我刚开始在 postgresql 中使用 timescaleDB。我有一个名为 storage_db
的数据库,其中包含一个名为 day_ahead_prices
.
的 table
安装 timescaledb 后,我正在按照 Migrate from the same postgresql database 将我的 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.:
我的 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
编辑 1:
我使用 flask
和 flask_sqlalchemy
在 python
中创建了 day_ahead_prices
table,代码是:
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);
时,您是在告诉数据库使用 day_ahead_prices
作为模板创建 tsdb_day_ahead_prices
table(相同的列,这些列的类型相同),但您还告诉它包括您在原始 table 和 apply/create 上为新 table 定义的默认值、约束和索引。
然后你正在执行使 tsdb_day_ahead_prices
table 的 timescaledb 命令
超级table。 hypertable 是一种隐藏物理分区的抽象
table。 (https://www.timescale.com/products/how-it-works)。你在告诉
TimescaleDB 使用 date_time
列作为分区键使 tsdb_day_ahead_prices
成为 hypertable。
创建 hypertables 时,TimescaleDB 强加的一个约束是分区列(在您的情况下 'date_time')必须包含在任何唯一索引(和主键)中 table。 (https://docs.timescale.com/latest/using-timescaledb/schema-management#indexing-best-practices)
你得到的第一个错误 cannot create a unique index without the column "date_time"
正是因为这个。您复制了 id
列上的主键定义。所以主键是防止
table 成为超级table。
第二次,您创建了 tsdb_day_ahead_prices
table 但您没有复制
来自原始 table 的索引,因此未定义主键(这实际上是一个唯一索引)。所以创建 hypertable 成功了。
您从 create_hypertable 函数获得的输出告诉您您有一个新的 hypertable,在 public 模式中,hypertable 的名称,以及 timescaledb 使用的内部 ID。
所以现在您可以正常使用 tsdb_day_ahead_prices
,下面的 timescaledb 将确保数据进入正确的 partitions/chunks
此 table 的 ID 是否需要唯一?
如果您要保留时间序列数据
那么每一行对于每个 id 可能并不是真正唯一的,但可能在给定时间由 id 唯一标识。
您可以为您正在识别的项目创建一个单独的 table
items(id PRIMARY KEY, country_code)
并让 hypertable 成为
day_ahead_prices(time, value, item_id REFERENCES items(id))
我刚开始在 postgresql 中使用 timescaleDB。我有一个名为 storage_db
的数据库,其中包含一个名为 day_ahead_prices
.
安装 timescaledb 后,我正在按照 Migrate from the same postgresql database 将我的 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.:
我的 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
编辑 1:
我使用 flask
和 flask_sqlalchemy
在 python
中创建了 day_ahead_prices
table,代码是:
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);
时,您是在告诉数据库使用 day_ahead_prices
作为模板创建 tsdb_day_ahead_prices
table(相同的列,这些列的类型相同),但您还告诉它包括您在原始 table 和 apply/create 上为新 table 定义的默认值、约束和索引。
然后你正在执行使 tsdb_day_ahead_prices
table 的 timescaledb 命令
超级table。 hypertable 是一种隐藏物理分区的抽象
table。 (https://www.timescale.com/products/how-it-works)。你在告诉
TimescaleDB 使用 date_time
列作为分区键使 tsdb_day_ahead_prices
成为 hypertable。
创建 hypertables 时,TimescaleDB 强加的一个约束是分区列(在您的情况下 'date_time')必须包含在任何唯一索引(和主键)中 table。 (https://docs.timescale.com/latest/using-timescaledb/schema-management#indexing-best-practices)
你得到的第一个错误 cannot create a unique index without the column "date_time"
正是因为这个。您复制了 id
列上的主键定义。所以主键是防止
table 成为超级table。
第二次,您创建了 tsdb_day_ahead_prices
table 但您没有复制
来自原始 table 的索引,因此未定义主键(这实际上是一个唯一索引)。所以创建 hypertable 成功了。
您从 create_hypertable 函数获得的输出告诉您您有一个新的 hypertable,在 public 模式中,hypertable 的名称,以及 timescaledb 使用的内部 ID。
所以现在您可以正常使用 tsdb_day_ahead_prices
,下面的 timescaledb 将确保数据进入正确的 partitions/chunks
此 table 的 ID 是否需要唯一? 如果您要保留时间序列数据 那么每一行对于每个 id 可能并不是真正唯一的,但可能在给定时间由 id 唯一标识。
您可以为您正在识别的项目创建一个单独的 table
items(id PRIMARY KEY, country_code)
并让 hypertable 成为
day_ahead_prices(time, value, item_id REFERENCES items(id))