Wie füge ich Werte aus einer ausgewählten Abfrage in PostgreSQL in eine Tabelle ein?

199

Ich habe einen Tisch items (item_id serial, name varchar(10), item_group int)und einen Tisch items_ver (id serial, item_id int, name varchar(10), item_group int).

Jetzt möchte ich eine Zeile in items_vervon einfügen items. Gibt es dafür eine kurze SQL-Syntax?

Ich habe versucht mit:

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

Aber ich bekomme einen Syntaxfehler:

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

Ich habe jetzt versucht:

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

Es hat besser funktioniert, aber ich habe einen Fehler bekommen:

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;

Dies kann daran liegen, dass die Spalten in den Tabellen in einer anderen Reihenfolge definiert sind. Ist die Spaltenreihenfolge wichtig? Ich hoffte, dass PostgreSQL mit den Spaltennamen übereinstimmt.

Jonas
quelle

Antworten:

288

Die Spaltenreihenfolge spielt eine Rolle, wenn (und nur wenn) die Spaltenreihenfolgen übereinstimmen. Sie können zum Beispiel:

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

Oder wenn sie nicht übereinstimmen, könnten Sie zum Beispiel:

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

Das Verlassen auf die Spaltenreihenfolge ist jedoch ein Fehler, der darauf wartet, dass er auftritt (er kann sich ändern, ebenso wie die Anzahl der Spalten). Außerdem wird das Lesen von SQL dadurch schwieriger

Es gibt keine gute Verknüpfung. Sie sollten Spalten sowohl für die Tabelle, in die Sie einfügen, als auch für die Abfrage, die Sie für die Quelldaten verwenden, explizit auflisten. Beispiel:

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

dbfiddle hier

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

Für den gleichen Tisch

INSERT INTO test_import_three (id1, name1, name2) 
(SELECT 216 ,name1, name2 FROM test_import_three WHERE id = 4)
Nirmal Sharma
quelle
-1
INSERT INTO gate_pass(
     site_id, gate_pass_element, sequence_no, createdby, createddate, lastmodifiedby, lastmodifieddate)
SELECT 1,   gatepasselement, 3, 1,now(),1,now()  
FROM unnest(string_to_array('Bhushan,Amol,pallavi', E',')) as gatepasselement;
Bhushan Chaudhary
quelle