如何在不复制数据的情况下创建Oracle表的副本?

And*_*rew 269 sql oracle copy database-table

我知道声明:

create table xyz_new as select * from xyz;
Run Code Online (Sandbox Code Playgroud)

哪个复制结构和数据,但如果我只想要结构呢?

Jim*_*son 411

只需使用不会选择任何行的where子句:

create table xyz_new as select * from xyz where 1=0;
Run Code Online (Sandbox Code Playgroud)

限制

以下内容不会复制到新表中:

  • 序列
  • 触发器
  • 索引
  • 某些约束可能无法复制
  • 物化视图日志

这也不处理分区


  • 这是一个很好的,干净的答案.只是想提醒一下,这将*不包括任何约束..新表甚至不会有主键. (52认同)
  • 这也不会复制序列或触发器. (17认同)
  • 只是一个附录 - 它*将*包含*一些*约束 - 即将复制任何NOT NULL约束. (16认同)
  • 新表也不会有任何索引 - 不要试图在新表上进行大查询:-) (15认同)
  • 也不处理分区.但是,嘿. (7认同)
  • 不会包含物化视图日志等 (2认同)

Dav*_*sta 83

我使用了你接受了很多的方法,但有人指出它不会复制约束(除了NOT NULL,我认为).

如果要复制完整结构,则更高级的方法是:

SET LONG 5000
SELECT dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME' ) FROM DUAL;
Run Code Online (Sandbox Code Playgroud)

这将为您提供完整的创建语句文本,您可以根据需要修改该文本以创建新表.您当然必须更改表的名称和所有约束.

(您也可以使用EXP/IMP在旧版本中执行此操作,但现在更容易了.)

编辑添加 如果您所使用的表位于不同的架构中:

SELECT dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ) FROM DUAL;
Run Code Online (Sandbox Code Playgroud)

  • 所以它必须像将上述sql命令分配给变量一样.ryt?例如 `new_table = dbms_metadata.get_ddl('TABLE','MY_TABLE_NAME','OTHER_SCHEMA_NAME')."同时请让我知道LONG在这里做了什么. (5认同)

bra*_*iel 15

使用sql developer选择表并单击DDL选项卡

在sql工作表中运行它时,可以使用该代码创建一个没有数据的新表

sqldeveloper是oracle免费使用的应用程序.

如果表有序列或触发器,ddl有时也会为你生成序列或触发器.你必须要小心你的命令,并知道何时打开或关闭触发器.

  • 在 Oracle SQL Developer v.18.3 中,该选项卡称为“SQL” (2认同)

sun*_*leo 14

create table xyz_new as select * from xyz where rownum = -1;
Run Code Online (Sandbox Code Playgroud)

为了避免反复迭代并根据1 = 2的条件插入任何内容


小智 5

你可以这样做 Create table New_table as select * from Old_table where 1=2 ; ,但要小心 你创建的表没有像old_table那样有任何Index、PK等。