PG12 で日付範囲によって分割されたテーブルに FK を作成することは可能ですか?
大きなテーブル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.
では、2 つの列を持つ 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"
これを行う正しい方法は何ですか?