将表结构复制到新表中

Ale*_*x S 70 sql postgresql

有没有办法将表的结构复制到新表中,没有数据,包括所有键和约束?

cod*_*rhs 78

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

CREATE TABLE new_table_name ( like old_table_name including all)
Run Code Online (Sandbox Code Playgroud)

  • 值得注意的是,使用类似语法时,您还可以添加新列:`CREATE TABLE new(like old,extra_column text);` (9认同)
  • 刚刚尝试过。没有复制外键约束和触发器(PostgreSQL 9.2)。 (3认同)
  • 与其他答案一样,这有效,但有注意事项。除了 FK 的问题之外,这还会导致表共享串行列的任何序列。如果可能的话我会手动执行此操作。在大多数情况下,获取一张表的 CREATE TABLE、CREATE INDEX 等命令并相应地更改名称并不困难。 (3认同)

小智 67

那么,您可以使用SQL获得的最接近的是:

create table new (
    like old
    including defaults
    including constraints
    including indexes
);
Run Code Online (Sandbox Code Playgroud)

但它不会复制一切.缺少的最重要的东西是FOREIGN KEYs.此外 - 也不会复制触发器.其他事情也不确定.

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

pg_dump -s -t old databases | sed 's/old/new/g' | psql
Run Code Online (Sandbox Code Playgroud)

但请注意,这种简单的sed也会在其他地方将旧的更改为新的(例如,如果您的表列中名为"is_scolded",则它将变为"is_scnewed").

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

  • 最佳答案.请注意,如果您有一个"序列"值或某个其他列默认为序列,它将使用与旧表相同的序列!所以如果你把东西插入任何一个表中,那么两者都会增加. (10认同)

Chs*_*y76 11

看看pgAdmin - 到目前为止最简单的方法来做你想要的.
右键单击表,脚本 - 创建.


Dim*_*iev 9

要完全复制表,还可以使用使用TABLE命令的简短表单:

CREATE TABLE films2 AS
    TABLE films
    WITH NO DATA;
Run Code Online (Sandbox Code Playgroud)

更多细节在这里

  • @ lacrima你是对的.我编辑了我的答案:) (2认同)

pic*_*e 涅 7

怎么样

CREATE TABLE sample_table_copy AS (SELECT * FROM sample_table WHERE 1 = 2)
Run Code Online (Sandbox Code Playgroud)

postgresql.org回答

  • 表达“WHERE 1=2”的更好方法是“WHERE false”或根本没有 WHERE 子句,而是“LIMIT 0”。 (6认同)
  • 不幸的是,这不会保留键,约束或默认值。 (3认同)