Секционируемые таблицы не поддерживают ограничения UNIQUE, PRIMARY KEY, EXCLUDE и FOREIGN KEY; однако вы можете определить эти ограничения в отдельных секциях.
https://ru.stackoverflow.com/questions/1168712/Секционирование-существующей-таблицы-postgresql mht - Секционирование существующей таблицы PostgreSQL
https://habr.com/ru/company/skyeng/blog/583222/
mht - Партицирование таблиц в PostgreSQL: чек-лист для старта / есть про партицирование через наследование
/* -- новая таблица CREATE TABLE IF NOT EXISTS foo ( ts timestamp NULL ,c1 int4 NULL ,c2 text NULL )PARTITION BY RANGE (ts); CREATE TABLE IF NOT EXISTS foo_01 PARTITION OF foo ( primary key (c1) ) FOR VALUES FROM (MINVALUE) TO ('2020-01-02'); CREATE TABLE IF NOT EXISTS foo_02 PARTITION OF foo ( primary key (c1) ) FOR VALUES FROM ('2020-01-02') TO ('2020-01-03'); DELETE FROM foo; INSERT INTO foo SELECT '2020-01-01', i, md5(random()::text) FROM generate_series(1, 10) AS i; INSERT INTO foo SELECT '2020-01-02', i, md5(random()::text) FROM generate_series(11, 20) AS i; INSERT INTO foo SELECT '2000-01-01', i, md5(random()::text) FROM generate_series(100, 110) AS i; -- ----------------------------------------------------------------------------------------- -- существующая таблица CREATE TABLE IF NOT EXISTS foo2 ( ts timestamp NULL ,c1 int4 NULL primary key ,c2 text NULL ); DELETE FROM foo2; INSERT INTO foo2 SELECT '2020-01-01', i, md5(random()::text) FROM generate_series(1, 10) AS i; INSERT INTO foo2 SELECT '2020-01-02', i, md5(random()::text) FROM generate_series(11, 20) AS i; INSERT INTO foo2 SELECT '2000-01-01', i, md5(random()::text) FROM generate_series(100, 110) AS i; CREATE TABLE IF NOT EXISTS foo22 ( ts timestamp NULL ,c1 int4 NULL ,c2 text NULL )PARTITION BY RANGE (ts); CREATE TABLE IF NOT EXISTS foo2_01 PARTITION OF foo22 ( primary key (c1) ) FOR VALUES FROM (MINVALUE) TO ('2020-01-02'); CREATE TABLE IF NOT EXISTS foo2_02 PARTITION OF foo22 ( primary key (c1) ) FOR VALUES FROM ('2020-01-02') TO ('2020-01-03'); alter table foo2 rename to _foo; alter table foo22 rename to foo2; --alter table foo2 attach partition _foo for values from (MINVALUE) to ('2020-01-02'); --alter table foo2 attach partition _foo for values from ('2020-01-02') to ('2020-01-03'); INSERT INTO foo2(ts,c1,c2) select ts,c1,c2 FROM _foo; DROP TABLE _foo; */ -- ----------------------------------------------------------------------------------------- -- наследование CREATE TABLE IF NOT EXISTS foo3 ( ts TIMESTAMP NULL ,c1 int4 NULL )PARTITION BY RANGE (ts); CREATE TABLE IF NOT EXISTS foo31 ( c2 text NULL )INHERITS (foo3); DELETE FROM foo31; INSERT INTO foo31 SELECT '2020-01-01', i, md5(random()::text) FROM generate_series(1, 10) AS i; INSERT INTO foo31 SELECT '2020-01-02', i, md5(random()::text) FROM generate_series(11, 20) AS i; INSERT INTO foo31 SELECT '2000-01-01', i, md5(random()::text) FROM generate_series(100, 110) AS i;