jcho360 Asked: 2012-05-18 04:24:07 +0800 CST2012-05-18 04:24:07 +0800 CST 2012-05-18 04:24:07 +0800 CST 在不使用备份的情况下在 Oracle 中复制表的完整结构 772 当您创建一个表的 CTAS(创建表作为选择)时,您只会获得结构,但会丢失索引、PK、FK 等。 例子: create table t1 select * from table2; 如何在不进行备份的情况下制作包含这些内容的表结构副本? oracle 3 个回答 Voted Best Answer Philᵀᴹ 2012-05-18T04:31:36+08:002012-05-18T04:31:36+08:00 select dbms_metadata.get_ddl('TABLE','SCHEMANAME','TABLENAME') DDL from dual; TABLE是对象的类型(您也可以提取INDEX、、、VIEW等FUNCTION)PROCEDURE 或者: create table t1 as ( select * from t2 where 3=4 ); dbms_metadata.get_ddl是要走的路,因为它保留了 CTAS 查询所没有的各个方面。 Leigh Riffel 2012-05-18T07:05:21+08:002012-05-18T07:05:21+08:00 菲尔的回答很好,可能是你想要的。 SQL Developer从工具菜单中为该功能提供了一个向导。 根据您的要求,您可能想要进行导出(使用 dbms_metadata 包)。Oracle 概念指南(任何使用 Oracle 的人都必须阅读)有一个关于Oracle 数据泵导出和导入的部分(重点是我的)。 Oracle 数据泵支持数据和元数据的高速移动 ... Mark Hughs 2021-02-08T16:29:56+08:002021-02-08T16:29:56+08:00 基本上有3种方法可以将结构和数据复制到另一个表 创建表 myschema.newtable 作为 select * from anotherschema.oldtable where 1 = 1; /* 这将复制所有数据或 1 = 2 不复制数据但创建表 */ 如果您有 NVARCHAR (2000) 及更高版本、CLOBS 或 BLOBS 或扩展 varchar2 启用超过 32,767 作为创建不可见的约束索引。 使用 Oracle 元表 (select dbms_metadata.get_ddl('TABLE','SCHEMANAME','TABLENAME') DDL from dual; 如果您有主键、约束等,则此方法有效。使用 Oracle 12.2 或镜像表使用数据库链接的远程数据库。发生的情况是表定义分布在多行中,而您只能检索最新的。因此,如果有多行,您必须编写复杂的代码来循环遍历定义。这真是一个令人头疼的问题. 如果您使用的是 Oracle 12.2 或更高版本,则不值得麻烦。 如果您使用的是 Oracle 12.2 或更高版本,例如 19c,无论源表是否已分区,这都将起作用。但是,源表必须是本地的,而不是使用数据库链接的远程表。我还没有在任何地方看到为非分区源表记录的这种技术。但是,它适用于分区和非分区源表!创建表 MYSCHEMA.NEW_TMP 用于与表 MYSCHEMA.SOURCE_TABLE 进行交换;这将完全镜像列,以便您可以根据过滤器将源的数据复制到新表中。它不会复制 PK 或索引。需要注意的是,分区交换是加载数据的最快方法之一。它几乎是瞬时的。值得研究。
TABLE
是对象的类型(您也可以提取INDEX
、、、VIEW
等FUNCTION
)PROCEDURE
或者:
dbms_metadata.get_ddl
是要走的路,因为它保留了 CTAS 查询所没有的各个方面。菲尔的回答很好,可能是你想要的。 SQL Developer从工具菜单中为该功能提供了一个向导。
根据您的要求,您可能想要进行导出(使用 dbms_metadata 包)。Oracle 概念指南(任何使用 Oracle 的人都必须阅读)有一个关于Oracle 数据泵导出和导入的部分(重点是我的)。
基本上有3种方法可以将结构和数据复制到另一个表