Ik heb een tabel items (item_id serial, name varchar(10), item_group int)
en een tabel items_ver (id serial, item_id int, name varchar(10), item_group int)
.
Nu wil ik een rij invoegen in items_ver
van items
. Is er een korte SQL-syntaxis om dit te doen?
Ik heb geprobeerd met:
INSERT INTO items_ver VALUES (SELECT * FROM items WHERE item_id = 2);
maar ik krijg een syntaxisfout:
ERROR: syntax error at or near "select" LINE 1: INSERT INTO items_ver VALUES (SELECT * FROM items WHERE item...
Ik heb het nu geprobeerd:
INSERT INTO items_ver SELECT * FROM items WHERE item_id = 2;
Het werkte beter, maar ik kreeg een fout:
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;
Dit kan zijn omdat de kolommen in de tabellen in een andere volgorde zijn gedefinieerd. Is de volgorde van de kolommen van belang? Ik hoopte dat PostgreSQL overeenkomt met de kolomnamen.
Antwoord
Kolomvolgorde is van belang, dus als (en alleen als) de kolomvolgorde match kun je bijvoorbeeld:
insert into items_ver select * from items where item_id=2;
Of als ze niet matchen kun je bijvoorbeeld:
insert into items_ver(item_id, item_group, name) select * from items where item_id=2;
maar vertrouwen op de kolomvolgorde is een bug die wacht om te gebeuren (het kan veranderen, evenals het aantal kolommen) – het maakt je SQL ook moeilijker te lezen
Er is geen goede ” shortcut “- u moet expliciet kolommen vermelden voor zowel de tabel waarin u invoegt als de query die u gebruikt voor de brongegevens, bijvoorbeeld:
insert into items_ver (item_id, name, item_group) select item_id, name, item_group from items where item_id=2;
dbfiddle hier
Antwoord
INSERT INTO test_import_two (name, name1, name2) (SELECT name, name1, name2 FROM test_import_one WHERE id = 2)
Voor dezelfde tabel
INSERT INTO test_import_three (id1, name1, name2) (SELECT 216 ,name1, name2 FROM test_import_three WHERE id = 4)
Antwoord
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;