Ответ 1
Нет никакого простого способа вернуть json_populate_record
маркер, который означает "сгенерировать это значение".
PostgreSQL не позволяет вставлять NULL
, чтобы указать, что значение должно быть сгенерировано. Если вы попросите NULL
Pg, значит, будет означать NULL
и не хочет вас угадывать. Кроме того, вполне нормально иметь сгенерированный столбец, который не имеет ограничения NOT NULL
, и в этом случае отлично вставить в него NULL
.
Если вы хотите, чтобы PostgreSQL использовал таблицу по умолчанию для значения, есть два способа сделать это:
- Опустить эту строку из списка столбцов
INSERT
; или - Явно писать
DEFAULT
, который действителен только в выраженииVALUES
Поскольку вы не можете использовать VALUES(DEFAULT, ...)
здесь, ваш единственный вариант - опустить столбец из списка столбцов INSERT
:
regress=# create table test (id serial primary key, name varchar(50));
CREATE TABLE
regress=# insert into test(name) select name from json_populate_record(NULL::test, '{"name": "John"}');
INSERT 0 1
Да, это означает, что вы должны перечислить столбцы. Дважды, фактически, один раз в списке SELECT
и один раз в столбце INSERT
.
Чтобы избежать необходимости в этом, PostgreSQL должен иметь способ указать DEFAULT
как значение для записи, поэтому json_populate_record
может возвращать DEFAULT
вместо NULL
для столбцов, которые не определены, Возможно, это не то, что вы планировали для всех столбцов, и привело бы к вопросу о том, как DEFAULT
будет обрабатываться, когда json_populate_record
не используется в выражении INSERT
.
Итак, я думаю, json_populate_record
может оказаться менее полезным, чем вы надеялись на строки с сгенерированными ключами.