it-swarm.dev

Jak wstawić wartości do tabeli z wybranego zapytania w PostgreSQL?

Mam tabelę items (item_id serial, name varchar(10), item_group int) i tabelę items_ver (id serial, item_id int, name varchar(10), item_group int).

Teraz chcę wstawić wiersz do items_ver od items. Czy jest do tego jakaś krótka składnia SQL?

Próbowałem z:

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

ale pojawia się błąd składniowy:

ERROR:  syntax error at or near "select"
LINE 1: INSERT INTO items_ver VALUES (SELECT * FROM items WHERE item...

Próbowałem teraz:

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

Działa lepiej, ale mam błąd:

ERROR:  column "item_group" is of type integer but expression is of type 
character varying
LINE 1: INSERT INTO items_ver SELECT * FROM items WHERE item_id = 2;

Może to być spowodowane tym, że kolumny w tabelach są zdefiniowane w innej kolejności. Czy kolejność kolumn ma znaczenie? Miałem nadzieję, że PostgreSQL pasuje do nazw kolumn.

225
Jonas

Kolejność kolumn ma znaczenie, więc jeśli (i tylko jeśli) kolejność kolumn jest zgodna, możesz na przykład:

insert into items_ver
select * from items where item_id=2;

Lub jeśli nie pasują, możesz na przykład:

insert into items_ver(item_id, item_group, name)
select * from items where item_id=2;

ale poleganie na kolejności kolumn jest błędem, który może się zdarzyć (może się zmienić, podobnie jak liczba kolumn) - utrudnia także czytanie SQL

Nie ma dobrego „skrótu” - należy wyraźnie wymienić kolumny zarówno dla tabeli, do której wstawiasz, jak i zapytania, którego używasz dla danych źródłowych, np .:

insert into items_ver (item_id, name, item_group)
select item_id, name, item_group from items where item_id=2;

dbfiddle tutaj

INSERT INTO test_import_two (name, name1, name2) 
(SELECT name, name1, name2 FROM test_import_one WHERE id = 2)

Dla tego samego stołu

INSERT INTO test_import_three (id1, name1, name2) 
(SELECT 216 ,name1, name2 FROM test_import_three WHERE id = 4)
12
Nirmal Sharma