@ Приведенное выше решение Джереми Густи почти работает, но будет работать неправильно, если порядковые номера выключены (или вообще потерпят неудачу, если переупорядоченные порядковые номера приводят в соответствие несовместимые типы). Попробуйте:
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;
Результаты показывают проблему:
testdb=> select * from test2;
three | two | one
-------+-----+-------
one | two | three
(1 row)
Вы можете исправить это, указав имена столбцов во вставке:
INSERT INTO test2 (one, two, three) SELECT * FROM test1;
Это дает вам то, что вы действительно хотите:
testdb=> select * from test2;
three | two | one
-------+-----+-----
three | two | one
(1 row)
Проблема возникает, когда у вас есть наследие, которое этого не делает, как я указал выше в моем комментарии к ответу peufeu.
Обновление: Мне пришло в голову, что вы можете сделать то же самое с именами столбцов в предложении INSERT, указав имена столбцов в предложении SELECT. Вам просто нужно изменить их порядок в соответствии с порядковыми номерами в целевой таблице:
INSERT INTO test2 SELECT three, two, one FROM test1;
И вы, конечно, можете сделать и то, и другое очень четко:
INSERT INTO test2 (one, two, three) SELECT one, two, three FROM test1;
Это дает те же результаты, что и выше, с правильно подобранными значениями столбцов.