Вот упрощенная версия запроса PostgreSQL для вставки нескольких строк в таблицу:
INSERT INTO my_table (a, b, datasource)
VALUES
('foo', 'bar', 'my source'),
('foo', DEFAULT, 'my source'),
(DEFAULT, 'bar', 'my source');
Обратите внимание, что значение DEFAULT
может отображаться в столбце a
или b
.
Это работает нормально, однако я хочу вставить только строки, которые соответствуют некоторым критериям, и дополнительно было бы неплохо удалить дублирование для значений, которые являются постоянными для всех вставляемых строк.
Поэтому я пытаюсь изменить его на что-то вроде этого:
INSERT INTO my_table (a, b, datasource)
SELECT v.*, 'my source'
FROM (VALUES ('foo', 'bar'), ('foo', DEFAULT), (DEFAULT, 'bar')) AS v (a, b)
WHERE v.a = 'foo';
Это приводит к ошибке: DEFAULT is not allowed in this context
.
Как мне обойти это?
Возможно, стоит отметить, что в действительности условие WHERE
на самом деле является сложным и включает в себя другие таблицы. Также есть несколько тысяч строк для вставки за раз, причем выражения значений генерируются программно. Можно сделать так, чтобы буквальные значения по умолчанию для таблицы выводились вместо DEFAULT
, однако это требует жесткого кодирования их вне базы данных, чего я хочу избежать (потому что, если я изменю их в БД и забуду обновить жестко закодированные значения, это вызовет проблемы).