SERIAL работает с NULL, ВСЕГДА СОЗДАЕТСЯ КАК ИДЕНТИЧНОСТЬ, а не

Постгрес 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, даже если он предлагается. Что мне здесь не хватает?

Спасибо.


person Gabriel A. Zorrilla    schedule 11.07.2020    source источник
comment
Вместо этого используйте insert into l_table (w_id) values (1); — при вставке в раздел не отображается столбец идентификаторов по умолчанию.   -  person Bergi    schedule 11.07.2020
comment
Похоже, это работает. Пожалуйста, ответьте на это, и я проверю это. Спасибо!   -  person Gabriel A. Zorrilla    schedule 11.07.2020


Ответы (1)


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

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

insert into l_table (w_id) values (1);

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

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

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

person Bergi    schedule 11.07.2020