@ La solución anterior de Jeemy Gustie casi funciona, pero hará lo incorrecto si los ordinales están desactivados (o fallan por completo si los ordinales reordenados hacen que los tipos incompatibles coincidan). Darle una oportunidad:
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;
Los resultados muestran el problema:
testdb=> select * from test2;
three | two | one
-------+-----+-------
one | two | three
(1 row)
Usted puede remediar esto especificando los nombres de columna en el inserto:
INSERT INTO test2 (one, two, three) SELECT * FROM test1;
Eso le da lo que realmente quiero:
testdb=> select * from test2;
three | two | one
-------+-----+-----
three | two | one
(1 row)
El problema viene cuando tienes un legado que no hace esto, como indiqué anteriormente en mi comentario sobre la respuesta de peufeu.
Actualización: Se me ocurrió que puede hacer lo mismo con los nombres de columna en la cláusula INSERT especificando los nombres de columna en la cláusula SELECT. Sólo tienes que cambiar su orden para que coincida con los ordinales en la tabla de destino:
INSERT INTO test2 SELECT three, two, one FROM test1;
Y por supuesto, puedes hacer las dos cosas a ser muy explícito:
INSERT INTO test2 (one, two, three) SELECT one, two, three FROM test1;
Eso le da los mismos resultados que el anterior, con los valores de columna correctamente emparejados.
El orden de las columnas es totalmente irrelevante en las bases de datos relacionales, solo se trata de mostrarlas en una herramienta. La tabla de la base de datos no tiene ningún orden de las columnas. –