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 обсуждаются некоторые обходные пути.