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 in items_ver
von items
einfügen. Gibt es dafür eine kurze SQL-Syntax?
Ich habe es versucht mit:
INSERT INTO items_ver VALUES (SELECT * FROM items WHERE item_id = 2);
, aber ich erhalte 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 Ein Fehler:
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.
Antwort
Die Spaltenreihenfolge spielt eine Rolle, wenn (und nur wenn) die Spaltenreihenfolge Sie können beispielsweise übereinstimmen:
insert into items_ver select * from items where item_id=2;
Wenn sie nicht übereinstimmen, können Sie beispielsweise Folgendes tun:
insert into items_ver(item_id, item_group, name) select * from items where item_id=2;
, aber das Verlassen auf die Spaltenreihenfolge ist 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 kein gutes “ 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. B.:
insert into items_ver (item_id, name, item_group) select item_id, name, item_group from items where item_id=2;
dbfiddle hier
Antwort
INSERT INTO test_import_two (name, name1, name2) (SELECT name, name1, name2 FROM test_import_one WHERE id = 2)
Für dieselbe Tabelle
INSERT INTO test_import_three (id1, name1, name2) (SELECT 216 ,name1, name2 FROM test_import_three WHERE id = 4)
Antwort
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;