как вставить DEFAULT в подготовленный оператор в PostgreSQL - PullRequest
1 голос
/ 04 ноября 2019

Я пытаюсь вставить значения в базу данных, используя подготовленные операторы, но иногда мне нужно для определенного значения вставить литерал 'DEFAULT', как мне это сделать?

CREATE TABLE test (id int, firstname text default 'john', lastname text default 'doe');

Эточто я хочу сделать, но затем использовать подготовленное утверждение:

insert into test (id, firstname, lastname) VALUES ('1', DEFAULT, DEFAULT);

Но это приводит к ошибке (по понятным причинам):

PREPARE testprep (integer, text, text) AS INSERT INTO test (id, firstname, lastname) VALUES ($1, $2, $3);
EXECUTE testprep('1',DEFAULT,DEFAULT);

Ошибка:

ERROR: syntax error at or near "DEFAULT"

Оба примера, которые я создал с помощью SQL-Fiddle:

http://sqlfiddle.com/#!15/243ae/1/0

http://sqlfiddle.com/#!15/243ae/3/0

Ответы [ 2 ]

2 голосов
/ 04 ноября 2019

Невозможно сделать это с помощью подготовленного оператора.

Единственным выходом будет триггер BEFORE INSERT в таблице, который заменяет определенные значения данных (например, NULL) значением по умолчанию. Но это не очень хорошее решение и будет стоить производительности.

Другой путь к выходу - использовать несколько подготовленных операторов, по одному для каждой комбинации значений, для которых вы хотите установить значение по умолчанию.

1 голос
/ 04 ноября 2019

Вы можете попробовать опустить столбцы по умолчанию в операторе вставки:

PREPARE testprep (integer) AS
INSERT INTO test (id) VALUES ($1);
EXECUTE testprep('1');

Postgres должен полагаться на значения по умолчанию в определении таблицы для столбцов firstname и lastname. Из документации Postgres :

Когда создается новая строка и не указаны значения для некоторых столбцов, эти столбцы будут заполнены соответствующими значениями по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...