294

我知道这样的说法:

create table xyz_new as select * from xyz;

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

4

17 回答 17

459

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

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

限制

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

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

这也不处理分区


于 2008-10-24T14:55:55.660 回答
88

我使用了您经常接受的方法,但正如有人指出的那样,它不会重复约束(我认为 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;
于 2008-10-27T15:47:40.957 回答
17
create table xyz_new as select * from xyz where rownum = -1;

为了避免一次又一次地迭代并且根据 1=2 的条件不插入任何内容

于 2013-12-21T17:49:17.773 回答
16

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

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

sqldeveloper 是来自 oracle 的免费应用程序。

如果表有序列或触发器,则 d​​dl 有时也会为您生成这些。您只需要注意您制作它们的顺序并知道何时打开或关闭触发器。

于 2008-10-24T14:54:38.360 回答
4

你可以这样做 Create table New_table as select * from Old_table where 1=2 ; 但要小心 你创建的表没有任何索引,PK等像old_table。

于 2015-12-10T23:14:18.280 回答
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; 
于 2016-12-05T19:17:52.203 回答
1

只需编写如下查询:

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

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

于 2014-02-07T14:34:06.387 回答
1
SELECT * INTO newtable
FROM oldtable
WHERE 1 = 0;

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

于 2017-08-31T23:21:21.183 回答
1

如果需要创建一个表(具有空结构)只是为了EXCHANGE PARTITION,最好使用“..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 PARTITION 中的列类型或大小不匹配

请参阅此以进一步阅读...

于 2020-10-06T20:02:53.050 回答
0

你也可以做一个

create table abc_new as select * from abc; 

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

于 2011-02-24T06:46:27.257 回答
0

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

接下来,您使用 new_table_name 运行脚本

于 2015-06-11T08:29:40.580 回答
0

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

SELECT DBMS_METADATA.GET_DDL('TYPE','OBJECT_NAME','DATA_BASE_USER') TEXT FROM DUAL 
  • TYPETABLEPROCEDURE等等。

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

于 2015-08-19T14:06:29.933 回答
0

复制没有表数据

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

用表数据复制

create table <target_table> as select * from <source_table>;
于 2017-04-16T14:07:26.913 回答
0

WHERE 1 = 0或类似的错误条件有效,但我不喜欢它们的外观。Oracle 12c+ 恕我直言的稍微干净的代码是

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

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

于 2018-02-16T17:02:52.990 回答
-1
Create table target_table 
As
Select * 
from source_table 
where 1=2;

Source_table 是您要复制其结构的表。

于 2015-04-21T05:24:39.083 回答
-1
  1. 从 xyz 中选择 * 创建表 xyz_new;

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

  1. 从 xyz_new 中删除;

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

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

于 2019-08-13T19:54:03.983 回答
-6

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

第1步:

CREATE table new_table_name AS(Select * from old_table_name);

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

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

第2步:

DELETE * FROM new_table_name.

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

于 2012-08-28T20:07:02.657 回答