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

时间:2008-10-24 14:53:17

标签: sql oracle copy database-table

我知道声明:

create table xyz_new as select * from xyz;

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

17 个答案:

答案 0 :(得分:399)

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

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

限制

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

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

这也不处理分区


答案 1 :(得分:83)

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

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

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

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

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

已编辑添加 如果您所使用的表位于不同的模式中:

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

答案 2 :(得分:15)

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

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

sqldeveloper是oracle中免费使用的应用程序。

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

答案 3 :(得分:14)

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

一次又一次地避免迭代,并根据1 = 2

的条件不插入任何内容

答案 4 :(得分:4)

    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; 

答案 5 :(得分:3)

你可以这样做 INSERT INTO bag_grte_clm ( schd_dprt_ldt, arr_trpn_stn_cd, bkg_crtn_gdt, sbmt_bag_grte_clm_dt, bag_grte_clm_stt_cd, lst_updt_gts, bag_grte_clm_gts, dprt_trpn_stn_cd ) VALUES ( TO_DATE('2015/12/06', 'yyyy/mm/dd'), 'YUL', TO_DATE('2015-11-15', 'yyyy-mm-dd'), TO_DATE('120615', 'MMDDYY'), 'DENIAL', (current_timestamp), TO_TIMESTAMP('20151206 00:00:00', 'yyyymmdd hh:mm:ss'), 'ATL' ) 但要小心   您创建的表没有像old_table

那样的任何Index,Pk等

答案 6 :(得分:2)

SELECT * INTO newtable
FROM oldtable
WHERE 1 = 0;

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

答案 7 :(得分:1)

只需编写如下查询:

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

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

答案 8 :(得分:1)

WHERE 1 = 0或类似的错误条件有效,但我不喜欢它们的样子。适用于Oracle 12c + IMHO的更清晰的代码是

CREATE TABLE bar AS SELECT * FROM foo FETCH FIRST 0 ROWS ONLY;

同样的限制适用:只有列定义及其可为空性被复制到新表中。

答案 9 :(得分:0)

如果仅需创建一个表(具有空结构),则最好使用“ ..FOR EXCHANGE ..”子句。但是,仅从 Oracle版本 12.2 起可用。

CREATE TABLE t1_temp FOR EXCHANGE WITH TABLE t1;

如果正常的CTAS操作未完全复制表结构,则此地址在“交换分区”期间无缝寻址“ ORA-14097”。我已经看到Oracle在原始表中缺少一些“ DEFAULT”列和“ HIDDEN”列定义。

ORA-14097:ALTER TABLE EXCHANGE中的列类型或大小不匹配 分区

See this for further read...

答案 10 :(得分:0)

  
      
  1. 从xyz中选择*创建表xyz_new;
  2.   

-这将创建表并复制所有数据。

  
      
  1. 从xyz_new中删除;
  2.   

-这将具有相同的表结构,但所有复制的数据将被删除。

如果您想克服答案指定的限制: How can I create a copy of an Oracle table without copying the data?

答案 11 :(得分:0)

没有表数据的复制

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

复制表数据

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

答案 12 :(得分:0)

另外,您可以从下面列出的命令获取表创建的ddl,然后执行创建。

SELECT DBMS_METADATA.GET_DDL('TYPE','OBJECT_NAME','DATA_BASE_USER') TEXT FROM DUAL 

TYPE is ('TABLE','PROCEDURE', etc...)

使用此命令,您可以从数据库对象获得大部分ddl。

答案 13 :(得分:0)

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

接下来,使用new_table_name

运行脚本

答案 14 :(得分:0)

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

Source_table是你要复制结构的表。

答案 15 :(得分:0)

你也可以做一个

create table abc_new as select * from abc; 

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

答案 16 :(得分:-4)

上述任务可以通过两个简单的步骤完成。

第1步:

CREATE table new_table_name AS(Select * from old_table_name);

上面的query创建了一个表的副本(也包含内容)。

要获取结构,请使用。

删除表的内容

第2步:

DELETE * FROM new_table_name.

希望这能解决您的问题。并感谢早先的帖子。给了我很多见解。