SERIAL работает с NULL, ВСЕГДА генерируется как IDENTITY, а не - PullRequest
0 голосов
/ 11 июля 2020

Postgres 12:

CREATE TABLE l_table (
    id INT generated always as identity,
    w_id int NOT null references w_table(id),
    primary key (w_id, id)
)PARTITION BY LIST (w_id);

CREATE table l1 PARTITION OF l_table FOR VALUES IN (1);

insert into l1 (w_id) values (1);

Я получаю:

ERROR: null value in column "id" violates not-null constraint

Если я заменяю INT generated always as identity на SERIAL, работает . Это странно, поскольку в другой таблице сгенерированный идентификатор всегда работает с нулевым значением. Использование default в качестве значения тоже не работает.

GAAI должен быть стандартным SQL способом замены SERIAL, даже если он предлагается. Что мне здесь не хватает?

Спасибо.

1 Ответ

1 голос
/ 12 июля 2020

Что мне здесь не хватает?

Вы пытаетесь вставить в таблицу разделов l1 напрямую, а не в разделенный l_table. Это игнорирует столбец идентификаторов в родительской таблице, пытается вставить значение по умолчанию null и не выполняет ненулевое ограничение, которое имеет каждый столбец идентификаторов. Если вместо этого вы выполните

insert into l_table (w_id) values (1);

, он будет работать и направить вставленную строку в правый раздел.

Использование default в качестве значения тоже не работает.

Видимо это довольно сложно сделать. Как ПО УМОЛЧАНИЮ секционированный столбец идентификаторов? на dba.SE обсуждает некоторые обходные пути.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...