如何使用复制命令在 postgres 中将数据从一个表复制到另一个表
Posted
技术标签:
【中文标题】如何使用复制命令在 postgres 中将数据从一个表复制到另一个表【英文标题】:How do I copy data from one table to another in postgres using copy command 【发布时间】:2015-09-25 21:10:29 【问题描述】:我们使用copy命令将一张表的数据复制到数据库外的一个文件中。
是否可以使用命令将一张表的数据复制到另一张表中。
如果是,任何人都可以分享查询。
或者有没有更好的方法,比如我们可以使用 pg_dump 或类似的东西。
【问题讨论】:
不需要复制命令:insert into other (col1, col2) select col1, col2 from one
使用复制/转储的时间是在未连接数据库之间移动数据时(使用文件作为过渡)。如果表在同一个数据库中,则不需要这样做。
感谢您的回复,但我很好奇是否可以使用复制命令将数据从一个表复制到另一个表。如果是的话怎么做?
【参考方案1】:
你不能轻易做到这一点,但也没有必要这样做。
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 并仅恢复目标表。
【讨论】:
我刚刚为不同架构中的应用创建了重复的表,但是当我尝试使用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 新问题请在两个表中显示来自psql
的\d
输出
@RyanM 同样。您可以通过使用列名来避免这种情况,例如INSERT INTO mycopy (a, b) SELECT * FROM mytable
,但我来这里是为了寻找替代方法。我的表具有所有相同的列,只是顺序不同。事实证明这是不可能的。 ***.com/questions/1267427/…
第二个选项(包括所有)非常适合我使用 postgres 11.2 和 alpine linux 3.9
请注意,使用 (INCLUDING ALL) 创建的表将与其他表共享序列【参考方案2】:
如果两个表中的列相同(名称和数据类型),那么您可以使用以下内容
INSERT INTO receivingtable (SELECT * FROM sourcetable WHERE column1='parameter' AND column2='anotherparameter');
【讨论】:
【参考方案3】:假设已经有一个表,并且您想将所有记录从该表复制到另一个当前不存在于数据库中的表中,那么以下查询将为您完成此任务:
SELECT * into public."NewTable" FROM public."ExistingTable";
【讨论】:
请注意,select ... into
语法已被弃用,取而代之的是符合标准的 create table ... as select ...
以上是关于如何使用复制命令在 postgres 中将数据从一个表复制到另一个表的主要内容,如果未能解决你的问题,请参考以下文章
Postgres 创建触发器函数以在允许插入之前将值从一列复制到另一列