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

我知道这个说法:

create table xyz_new as select * from xyz; 

哪个副本的结构和数据,但如果我只是想要的结构呢?

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

 create table xyz_new as select * from xyz where 1=0; 

限制

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

  • 序列
  • 触发器
  • 索引
  • 一些约束可能不会被复制
  • 物化视图日志

这也不处理分区


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

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

 SET LONG 5000 SELECT dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME' ) FROM DUAL; 

这将为您提供完整的创build语句文本,您可以根据自己的意愿创build新的表格。 你将不得不改变表的名称和所有约束当然。

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

编辑添加如果您之后的表格处于不同的架构中:

 SELECT dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ) FROM DUAL; 

使用sql开发者select表并点击DDL选项卡

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

sqldeveloper是一个免费使用的应用程序从甲骨文。

如果表格有序列或触发器,ddl有时也会为你生成。 你只需要小心按照什么顺序让他们进来,知道什么时候打开或closures触发器。

 create table xyz_new as select * from xyz where rownum = -1; 

为了避免迭代一遍又一遍,并根据1 = 2的条件插入任何东西

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

简单地写一个查询,如:

 create table new_table as select * from old_table where 1=2; 

其中new_table是要创build的新表的名称, old_table是要复制其结构的现有表的名称,这将仅复制结构。

使用WITH DATANO DATA属性:

例如:

 CREATE TABLE db.tablename_now AS db.tablename_previous WITH DATA; 

来源: http : //forgetcode.com/Teradata/1209-COPY-TABLE-STRUCTURE-and-DATA

  DECLARE l_ddl VARCHAR2 (32767); BEGIN l_ddl := REPLACE ( REPLACE ( DBMS_LOB.SUBSTR (DBMS_METADATA.get_ddl ('TABLE', 'ACTIVITY_LOG', 'OLDSCHEMA')) , q'["OLDSCHEMA"]' , q'["NEWSCHEMA"]' ) , q'["OLDTABLSPACE"]' , q'["NEWTABLESPACE"]' ); EXECUTE IMMEDIATE l_ddl; END; 
 SELECT * INTO newtable FROM oldtable WHERE 1 = 0; 

使用另一个模式创build一个新的空表。 只需添加一个WHERE子句,使查询不返回任何数据:

你也可以做一个

 create table abc_new as select * from abc; 

然后截断表abc_new 。 希望这将足以满足您的要求。

 Create table target_table As Select * from source_table where 1=2; 

Source_table是表格你想复制的结构。

使用PL / SQL开发者,您可以在sql工作区或对象资源pipe理器中右键单击table_name,然后单击“view”,然后单击生成sql脚本的“view sql”以创build表以及所有约束,索引,分区等。

接下来,使用new_table_name运行脚本

换句话说,你可以从下面列出的命令中获得ddl的表创build,并执行创build。

 SELECT DBMS_METADATA.GET_DDL('TYPE','OBJECT_NAME','DATA_BASE_USER') TEXT FROM DUAL TYPE is ('TABLE','PROCEDURE', etc...) 

用这个命令你可以从数据库对象中获得大部分的ddl。

复制没有表格数据

 create table <target_table> as select * from <source_table> where 1=2; 

复制表格数据

 create table <target_table> as select * from <source_table>;