Как вставить в таблицу с ненулевыми столбцами, используя json?

Я пытаюсь вставить в таблицу food с несколькими ненулевыми столбцами по умолчанию, с такими командами, как:

  • food_insertone('{"id": 1, "taste": "sweet"}'::JSON)
  • food_insertone('{"id": 2}'::JSON)
  • food_insertone('{"id": 3, "taste": null}'::JSON)

И результат должен быть таким:

INSERTED 1, 'sweet'
INSERTED 2, ''
ERROR (null not allowed in taste)

Стол food определяется как:

CREATE TABLE "food" (
  "id"    INT,
  "taste" TEXT NOT NULL DEFAULT '',
  ...
);

CREATE OR REPLACE FUNCTION "food_insertone" (JSON)
RETURNS VOID AS $$
  INSERT INTO "food" SELECT * FROM json_populate_record(NULL::"food", $1);
$$ LANGUAGE SQL;

И я пытаюсь вставить как:

SELECT food_insertone('{"id": 1}'::JSON);

Но это не работает и выдает ошибку:

null value in column "taste" violates not-null constraint

Я это понимаю json_populate_record() создает значения NULL для столбцов, которые не упомянуты в JSON, что приводит к вставке значения NULL, и, следовательно, к этой ошибке. Простая вставка будет работать, но это динамическая таблица.

1 ответ

Решение

Использовать значение по умолчанию простой случай:

t=# create table food(id int, t text not null default 'some');
CREATE TABLE
t=# insert into food(id) SELECT id FROM json_populate_record(NULL::"food", '{"id":0}');
INSERT 0 1
t=# select * from food ;
 id |  t
----+------
  0 | some
(1 row)

используя coalesce и другое значение:

t=# insert into food(id,t) 
SELECT id,coalesce(t,'some simple other value') 
FROM json_populate_record(NULL::"food", '{"id":0}');   

и, конечно, вы можете использовать какой-то чудовищный способ получить действительное значение по умолчанию в:

t=# insert into food(id,t) SELECT id,coalesce(t,rtrim) FROM json_populate_record(NULL::"food", '{"id":0}') join (select rtrim(ltrim(split_part(column_default,'::',1),$$'$$),$$'$$) from information_schema.columns where table_name = 'food' and column_name = 't') dflt on true;
INSERT 0 1
t=# select * from food ;
 id |            t
----+-------------------------
  0 | some simple other value
  0 | some
(2 rows)
Другие вопросы по тегам