SERIAL работает с NULL, ВСЕГДА ГЕНЕРИРУЕТСЯ, КАК IDENTITY не

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 ответ

Решение

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

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

insert into l_table (w_id) values (1);

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

С помощью default как значение тоже не работает.

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

Другие вопросы по тегам