首页 文章

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

提问于
浏览
238

我知道声明:

create table xyz_new as select * from xyz;

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

15 回答

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

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

  • 0

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

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

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

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

  • 0

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

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

    限制

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

    • 序列

    • 触发器

    • 索引

    • 某些约束可能无法复制

    • 物化视图日志

    这也不处理分区


  • 374

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

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

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

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

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

    Edited to add 如果您所使用的表位于不同的架构中:

    SELECT dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ) FROM DUAL;
    
  • 3
    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;
    
  • -4

    你可以这样做 Create table New_table as select * from Old_table where 1=2 ; but be careful 你创建的表没有像old_table那样的任何Index,Pk等等

  • 0
    SELECT * INTO newtable
    FROM oldtable
    WHERE 1 = 0;
    

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

  • 4

    只需编写如下查询:

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

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

  • 14

    WHERE 1 = 0 或类似的虚假条件有效,但我不喜欢它们的样子 . 适用于Oracle 12c恕我直言的更清晰的代码是

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

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

  • 0

    你也可以做一个

    create table abc_new as select * from abc;
    

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

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

    Source_table是你要复制结构的表 .

  • 81

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

    接下来,使用new_table_name运行脚本

  • 2

    在其他方面,您可以从下面列出的命令获取表创建的ddl,并执行创建 .

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

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

  • 0

    没有表数据的

    副本

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

    与表数据一起复制

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

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

    第1步:

    CREATE table new_table_name AS(Select * from old_table_name);
    

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

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

    第2步:

    DELETE * FROM new_table_name.
    

    希望这能解决你的问题 . 并感谢早先的帖子 . 给了我很多洞察力 .

相关问题