ОШИБКА: невозможно создать уникальный индекс без столбца «date_time» (используется при разбиении) - PullRequest
1 голос
/ 14 апреля 2020

Я только начал использовать timescaleDB с postgresql. У меня есть база данных с именем storage_db, которая содержит таблицу с именем day_ahead_prices.

. После установки timescaledb я следовал за Миграция из той же postgresql базы данных , чтобы перенести мою 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)

Я немного новичок в этом вопросе, поэтому кто-нибудь может объяснить мне, в чем разница между и то и другое и почему я получаю сообщение об ошибке в первом случае?

PS:

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, используя flask и 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

1 Ответ

1 голос
/ 14 апреля 2020

При выполнении 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). Вы говорите TimescaleDB, чтобы сделать tsdb_day_ahead_prices гипертабильным, используя столбец date_time в качестве ключа разделения.

При создании гипертекстовых таблиц одно ограничение, накладываемое TimescaleDB, заключается в том, что столбец разделения (в вашем случае «date_time») ) должен быть включен в любые уникальные индексы (и первичные ключи) для этой таблицы. (https://docs.timescale.com/latest/using-timescaledb/schema-management#indexing -бест-практики )

Первая ошибка, которую вы получите cannot create a unique index without the column "date_time", именно из-за этого. Вы скопировали определение первичного ключа в столбец id. Таким образом, первичный ключ предотвращает гипертабильность таблицы.

Во второй раз вы создали таблицу tsdb_day_ahead_prices, но не скопировали индексы из исходной таблицы, поэтому первичный ключ не определен (что на самом деле является уникальным индексом). Так что создание гипертаблицы было успешным.

Выходные данные, которые вы получаете от функции create_hypertable, сообщают, что у вас есть новая гипертаблица в схеме publi c, имя гипертаблицы и внутренний идентификатор, который timescaledb использует для нее.

Так что теперь вы можете использовать tsdb_day_ahead_prices как обычно, а timescaledb внизу будет следить за тем, чтобы данные попадали в соответствующие разделы / куски

Должен ли идентификатор быть уникальным для этой таблицы? Если вы собираетесь хранить данные временных рядов, то каждая строка может не быть уникальной для каждого идентификатора, но может быть уникально идентифицирована идентификатором в данный момент времени.

Вы можете создать отдельную таблицу для идентифицируемых вами элементов items(id PRIMARY KEY, country_code) и иметь гипертабильность: day_ahead_prices(time, value, item_id REFERENCES items(id))

...