Как вставить значения в таблицу из запроса select в PostgreSQL?

У меня есть таблица items (item_id serial, name varchar (10), item_group int) и таблица items_ver (id serial, item_id int, имя varchar (10), item_group int ).

Теперь я хочу вставить строку в items_ver из items. Есть ли короткий синтаксис SQL для этого?

Я пробовал с:

INSERT INTO items_ver VALUES (SELECT * FROM items WHERE item_id = 2);

, но я получаю синтаксическую ошибку:

ОШИБКА: ошибка синтаксиса в или рядом с "select"
LINE 1: INSERT INTO items_ver VALUES (SELECT * FROM items WHERE item ...

Теперь я попробовал:

INSERT INTO items_ver SELECT * FROM items WHERE item_id = 2;

Он работал лучше, но я получил сообщение об ошибке:

ОШИБКА: столбец «item_group» имеет тип integer, но выражение имеет тип
характерный
LINE 1: INSERT INTO items_ver SELECT * FROM items WHERE item_id = 2;

Это может быть потому, что столбцы определены в другом порядке в таблицах. Имеет ли смысл порядок столбцов? Я надеялся, что PostgreSQL соответствует именам столбцов.

123 голоса | спросил Jonas 27 Maypm11 2011, 12:33:05

2 ответа


188

Порядок столбцов имеет значение, если (и только если) порядки столбцов соответствуют, например:

вставить в items_ver
выберите * из элементов, где item_id = 2;

Или, если они не совпадают, вы можете, например:

вставить в items_ver (item_id, item_group, name)
выберите * из элементов, где item_id = 2;

, но полагаться на порядок столбцов - это ожидание ошибки (оно может меняться, а также количество столбцов) - это также делает ваш SQL труднее читать

Нет хорошего «ярлыка» - вы должны явно указывать столбцы как для таблицы, в которую вы вставляете, так и для запроса, который вы используете для исходных данных, например:

вставить в items_ver (item_id, name, item_group)
выберите item_id, name, item_group из элементов, где item_id = 2;

dbfiddle здесь

ответил Jack Douglas 27 Maypm11 2011, 13:01:09
-1
INSERT INTO test_import_two (имя, имя1, имя2)
(SELECT name, name1, name2 FROM test_import_one WHERE id = 2)

Для той же таблицы

INSERT INTO test_import_three (id1, name1, name2)
(SELECT 216, name1, name2 FROM test_import_three WHERE id = 4)
ответил Nirmal Sharma 28 ThuEurope/Moscow2017-12-28T22:15:23+03:00Europe/Moscow12bEurope/MoscowThu, 28 Dec 2017 22:15:23 +0300 2017, 22:15:23

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132