it-swarm-eu.dev

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

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

Jetzt möchte ich eine Zeile von items in items_ver Einfügen. 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.

225
Jonas

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

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, aufgetreten zu werden (er kann sich ändern, ebenso wie die Anzahl der Spalten) - es erschwert auch das Lesen von SQL

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, z.

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

dbfiddle hier

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)
12
Nirmal Sharma