我知道这句话:

create table xyz_new as select * from xyz;

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


当前回答

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

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

类型是表,程序等。

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

其他回答

创建表xyz_new作为select * from xyz;

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

Delete from xyz_new;

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

如果你想克服答案中指定的限制: 如何在不复制数据的情况下创建Oracle表的副本?

只需使用一个where子句,它不会选择任何行:

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

限制

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

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

这也不能处理分区


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

步骤1:

CREATE table new_table_name AS(Select * from old_table_name);

上面的查询创建了一个表的副本(包括内容)。

若要获得结构,使用删除表的内容。

步骤2:

DELETE * FROM new_table_name.

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

    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; 

没有表数据的复制

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

复制表数据

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