@Jeremy La soluzione di Gustie sopra funziona quasi, ma farà la cosa sbagliata se gli ordinali sono spenti (o falliscono del tutto se gli ordinali riordinati corrispondono a tipi incompatibili). Fate una prova:
CREATE TABLE test1 (one varchar, two varchar, three varchar);
CREATE TABLE test2 (three varchar, two varchar, one varchar);
INSERT INTO test1 (one, two, three) VALUES ('one', 'two', 'three');
INSERT INTO test2 SELECT * FROM test1;
SELECT * FROM test2;
I risultati mostrano il problema:
testdb=> select * from test2;
three | two | one
-------+-----+-------
one | two | three
(1 row)
È possibile rimediare a questo specificando i nomi delle colonne nell'inserto:
INSERT INTO test2 (one, two, three) SELECT * FROM test1;
Che ti dà quello che ti vuole veramente:
testdb=> select * from test2;
three | two | one
-------+-----+-----
three | two | one
(1 row)
Il problema si presenta quando si ha legacy che non lo fa, come ho indicato sopra nel mio commento sulla risposta di Peufeu.
Aggiornamento: Mi è venuto in mente che è possibile fare la stessa cosa con i nomi delle colonne nella clausola INSERT specificando i nomi delle colonne nella clausola SELECT. Devi solo riordinarli per abbinare gli ordinali nella tabella di destinazione:
INSERT INTO test2 SELECT three, two, one FROM test1;
E si può ovviamente fare entrambe di essere molto esplicito:
INSERT INTO test2 (one, two, three) SELECT one, two, three FROM test1;
Che ti dà gli stessi risultati di cui sopra, con i valori della colonna correttamente abbinati.
L'ordine delle colonne è totalmente irrilevante nei database relazionali - è solo questione di visualizzarli in uno strumento. La tabella del database non ha alcun ordinamento delle colonne. –