Ответ 1
INSERT INTO widgets
(
map_id,
widget_name
)
SELECT
mt.map_id, 'Bupo'
FROM
map_tags mt
WHERE
mt.map_license = '12345'
У меня есть таблица под названием map_tags
:
map_id | map_license | map_desc
И еще одна таблица (widgets
), записи которой содержат ссылку на внешний ключ (от 1 до 1) на запись map_tags
:
widget_id | map_id | widget_name
Учитывая ограничение, что все map_license
уникальны (однако не настроены как клавиши на map_tags
), тогда, если у меня есть map_license
и a widget_name
, я бы хотел выполнить вставку widgets
все внутри одного и того же оператора SQL:
INSERT INTO
widgets w
(
map_id,
widget_name
)
VALUES (
(
SELECT
mt.map_id
FROM
map_tags mt
WHERE
// This should work and return a single record because map_license is unique
mt.map_license = '12345'
),
'Bupo'
)
Я считаю, что нахожусь на правильном пути, но знаю сразу, что это неправильный SQL для Postgres. Кто-нибудь знает правильный способ достижения такого единого запроса?
INSERT INTO widgets
(
map_id,
widget_name
)
SELECT
mt.map_id, 'Bupo'
FROM
map_tags mt
WHERE
mt.map_license = '12345'
Используйте вариант INSERT INTO SELECT
, включая любые константы, прямо в инструкции SELECT
.
Синтаксис PostgreSQL INSERT
:
INSERT INTO table [ ( column [, ...] ) ]
{ DEFAULT VALUES | VALUES ( { expression | DEFAULT } [, ...] ) [, ...] | query }
[ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]
Обратите внимание на параметр запрос в конце второй строки выше.
Вот вам пример.
INSERT INTO
widgets
(
map_id,
widget_name
)
SELECT
mt.map_id,
'Bupo'
FROM
map_tags mt
WHERE
mt.map_license = '12345'