Как создать FK для таблицы, разбитой по дате в PG12 - PullRequest
0 голосов
/ 08 ноября 2019

Можно ли создать FK для таблицы, разделенной по диапазону дат в PG12?

Представьте, что у меня есть большая таблица user_session и event таблица с FK:

create table user_session(                       -- BIG TABLE to be partitioned
    id         bigserial primary key,
    created_at timestamptz not null default now(),
    some_info  text
);

create table event(
    id      bigserial primary key,
    user_id bigint references user_session (id), -- FK
    data    text
);

Первая идея состояла в том, чтобы создать новую схему, подобную этой:

create table user_session(
    id         bigserial primary key,
    created_at timestamptz not null default now(),
    some_info  text
) PARTITION BY RANGE (created_at);

Но это не получается с ошибкой: Detail: PRIMARY KEY constraint on table "user_session" lacks column "created_at" which is part of the partition key.

Хорошо, давайте создадим PK с двумя столбцами:

create table user_session(
    id         bigserial,
    created_at timestamptz not null default now(),
    some_info  text,
    primary key (id, created_at)
) PARTITION BY RANGE (created_at);

Однако теперь я не могу создать таблицу event: [42830] ERROR: there is no unique constraint matching given keys for referenced table "user_session". Я также не могу создать уникальное ограничение вручную.


В большинстве статей Postgres есть код без PK на многораздельной таблице:

create table user_session(
    id         bigserial,
    created_at timestamptz not null default now(),
    some_info  text,
) PARTITION BY RANGE (created_at);

Однако теперь я не могу создать eventтаблица: [42830] ERROR: there is no unique constraint matching given keys for referenced table "user_session"

Как правильно это сделать?

...