Для json_populate_record
нет простого способа вернуть маркер, что означает «сгенерировать это значение».
PostgreSQL делает не Позволяет вам вставить NULL
, чтобы указать, что значение должно быть сгенерировано. Если вы попросите NULL
Pg ожидает означаетNULL
и не хочет вас укусить. Кроме того, вполне нормально иметь сгенерированный столбец, который не имеет ограничения NOT NULL
, и в этом случае отлично вставить в него NULL
.
Если вы хотите, чтобы PostgreSQL использовать таблицу по умолчанию для значения Есть два способа сделать это:
- Omit, что строка из
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
может быть менее полезным, чем вы надеялись на строки с сгенерированными ключами.
"Я нашел функцию' json_populate_record'. Um. *Где*? Что такое определение функции? Вы используете бета-версию PostgreSQL 9.3, или это функция, которую вы установили из другого места? –
Это 9,3 бета функция – user2627000