代码之家  ›  专栏  ›  技术社区  ›  jitbit

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

  •  240
  • jitbit  · 技术社区  · 17 年前

    create table xyz_new as select * from xyz;
    

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

    15 回复  |  直到 12 年前
        1
  •  451
  •   Raul Luna    8 年前

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

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

    局限性

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

    这也不处理分区


        2
  •  87
  •   Dave Costa    13 年前

    我使用了您经常接受的方法,但正如有人指出的那样,它不会复制约束(我认为除了NOTNULL)。

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

    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;
    
        3
  •  17
  •   sunleo    12 年前
    create table xyz_new as select * from xyz where rownum = -1;
    

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

        4
  •  16
  •   branchgabriel    17 年前

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

    sqldeveloper是oracle提供的免费应用程序。

        5
  •  4
  •   Brian Leach    9 年前
        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; 
    
        6
  •  3
  •   Vasil Lukach    5 年前

    你可以这样做 Create table New_table as select * from Old_table where 1=2 ; 但是要小心 您创建的表与旧的_表不同,没有任何索引、PK等。

        7
  •  1
  •   TLama    12 年前

    只需编写如下查询:

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

    哪里 new_table 要创建的新表的名称,并且 old_table 要复制其结构的现有表的名称,这将仅复制其结构。

        8
  •  1
  •   guesswho    8 年前
    SELECT * INTO newtable
    FROM oldtable
    WHERE 1 = 0;
    

        9
  •  1
  •   pahariayogi    5 年前

    如果需要创建一个表(具有空结构),只需 ,最好使用“.FOR EXCHANGE…”子句。它只能从 12.2 尽管如此。

    CREATE TABLE t1_temp FOR EXCHANGE WITH TABLE t1;
    

    如果正常的CTAS操作没有准确复制表结构,则在“exchange分区”期间无缝地寻址“ORA-14097”。我看到Oracle缺少原始表中的一些“默认”列和“隐藏”列定义。

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

    See this for further read...

        10
  •  0
  •   Zoltan Toth    13 年前

    你也可以做一个

    create table abc_new as select * from abc; 
    

    然后截断表 abc_new . 希望这能满足你的要求。

        11
  •  0
  •   Robert Mars_win    11 年前

    使用pl/sql developer,您可以在sql工作区或对象资源管理器中右键单击表名称,然后单击“视图”,再单击“查看sql”,这将生成sql脚本以创建表以及所有约束、索引、分区等。。

    接下来,使用新的表名运行脚本

        12
  •  0
  •   Alok    9 年前

    不带表数据的复制

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

    create table <target_table> as select * from <source_table>;
    
        13
  •  0
  •   Dima Korobskiy    8 年前

    WHERE 1 = 0 或者类似的错误情况也会起作用,但我不喜欢它们的样子。Oracle 12c+IMHO的代码稍微干净一些

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

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

        14
  •  0
  •   Sridhar Sarnobat    7 年前

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

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

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

        15
  •  -1
  •   Adrian Cid Almaguer Abhishek    11 年前
    Create table target_table 
    As
    Select * 
    from source_table 
    where 1=2;
    

    Source_table是要复制其结构的表。

        16
  •  -1
  •   Jeevan Reddy Gujjula    7 年前
    1. 创建表格xyz_new作为select*from xyz;

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

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

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

        17
  •  -6
  •   Community Mohan Dere    6 年前

    CREATE table new_table_name AS(Select * from old_table_name);
    

    这个 query

    要获取结构,请使用删除表的内容。

    步骤2:

    DELETE * FROM new_table_name.
    

    希望这能解决你的问题。感谢之前的帖子。给了我很多洞察力。