将表结构复制到新表中


91

有没有一种方法可以在没有数据(包括所有键和约束)的情况下将表的结构复制到新表中?

Answers:


106

对于简单的模式副本,请使用like子句。

CREATE TABLE new_table_name ( like old_table_name including all)

13
值得注意的是,您也可以在使用类似语法时添加新列:CREATE TABLE new (like old, extra_column text);
Brad Koch,

@BradKoch是否可以在此语句中添加额外的约束?还是应该单独使用?
安德烈·德尼科

@AndreyDeineko视情况而定,请查看创建表文档以获取完整详细信息。您可以使用此语法轻松地添加检查和外键约束,就像使用任何其他create语句一样,但是我不确定是否可以在不进行后续更改的情况下应用列级别约束(例如not null)。
布拉德·科赫

2
刚刚尝试过。没有复制外键约束和触发器(PostgreSQL 9.2)。
贾尼斯·埃默里斯(JānisElmeris)

73

好吧,使用SQL可以得到的最接近的是:

create table new (
    like old
    including defaults
    including constraints
    including indexes
);

但这不会复制所有内容。缺少的最重要的东西是外键。另外-触发器也不会被复制。不知道其他事情。

另一种方法是转储表结构,在转储中更改其名称,然后再次加载它:

pg_dump -s -t old databases | sed 's/old/new/g' | psql

但是请注意,这种简单的sed在其他地方也会由新变旧(例如,如果表列中的名称为“ is_scolded”,则它将变为“ is_scnewed”)。

问题实际上是:您为什么需要它-因为出于各种目的,我会使用不同的技术。


注意:including constraints不适用于PostgreSQL 8.3
Ragnar123'6

1
在Postgres 9.3中像魅力一样工作:)
Ganapathy 2014年

14
最佳答案。请注意,如果您有一个“序列”值或其他默认为序列的列,它将使用与旧表相同的序列!因此,如果您将内容插入任何一个表中,则两者都会增加。
sudo


10

看一下pgAdmin-到目前为止,做您想要的事情的最简单方法。
右键单击表,脚本-创建。


我只能访问phpPgAdmin;我没有服务器。
Alex S

很公平。在phpPgAdmin中:导航到表,单击“导出”,选择“仅结构”,然后您就有了脚本
ChssPly76

我很确定他们一定是这个安装程序中的错误-当我这样做时,它只会在右框中显示空白页:/
Alex S

1
您是否同时尝试了“显示”或“下载”选项?如果两者都不起作用,则可能是错误。如果是这样,您将需要通过SQL进行操作,请查看Dav答案中的链接。
2009年

下载只是给我一个空文件。
Alex S

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.