如何使用复制命令在Postgres中将数据从一个表复制到另一个表


78

我们使用copy命令将一个表的数据复制到数据库外部的文件中。

是否可以使用命令将一个表的数据复制到另一表。

如果是,任何人都可以共享查询。

或者有没有更好的方法,例如我们可以使用pg_dump或类似的方法。


4
无需复制命令:insert into other (col1, col2) select col1, col2 from one
a_horse_with_no_name 2015年

3
复制/转储的时间是在未连接的数据库之间移动数据时(使用文件作为临时文件)。如果表在同一个数据库中,则无需这样做。
user2864740

感谢您的答复,但我只是好奇是否可以使用copy命令将数据从一个表复制到另一个表。如果是的话如何?
Mohitd23年

Answers:


172

您不能轻易做到这一点,但也没有必要这样做。

CREATE TABLE mycopy AS
SELECT * FROM mytable;

要么

CREATE TABLE mycopy (LIKE mytable INCLUDING ALL);

INSERT INTO mycopy
SELECT * FROM mytable;

如果只需要选择某些列或对其重新排序,则可以执行以下操作:

INSERT INTO mycopy(colA, colB)
SELECT col1, col2 FROM mytable;

您还可以选择性地进行pg_dump并仅还原目标表。


2
我只是在不同的架构中为应用程序创建了重复表,但是当我尝试这种INSERT INTO mycopy SELECT * FROM mytable方法时,我ERROR: column "order" is of type integer but expression is of type text LINE 2: SELECT * FROM django_apps.about_post 要明白,order两个表中都是整数。
RyanM '18年

@RyanM请问新问题,并在两个表中显示\d输出psql
Craig Ringer

2
@RyanM一样。您可以通过使用列名(例如)来避免这种情况INSERT INTO mycopy (a, b) SELECT * FROM mytable,但是我来这里是为了寻找一种替代方法。我的表具有相同的列,只是顺序不同。事实证明这是不可能的。stackoverflow.com/questions/1267427/…–
Noumenon

第二个选项(包括全部)对我而言非常适合
Postgres

5
请注意,使用(INCLUDING ALL)创建的表将与另一个表共享序列
Victor Ivanov,

5

如果两个表中的列相同(名称和数据类型),则可以使用以下内容

INSERT INTO receivingtable (SELECT * FROM sourcetable WHERE column1='parameter' AND column2='anotherparameter');

3

假设已经有一个表,并且您要将所有记录从该表复制到数据库中当前不存在的另一个表,那么以下查询将为您完成此任务:

SELECT * into public."NewTable" FROM public."ExistingTable";

1
请注意,select ... into不赞成使用该语法,而是希望符合标准create table ... as select ...
a_horse_with_no_name
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.