我知道这句话:

create table xyz_new as select * from xyz;

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


当前回答

SELECT * INTO newtable
FROM oldtable
WHERE 1 = 0;

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

其他回答

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

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

Sqldeveloper是oracle提供的一个免费应用程序。

如果表有序列或触发器,ddl有时也会为您生成这些。你只需要注意它们的顺序,知道什么时候打开或关闭触发器。

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

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

限制

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

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

这也不能处理分区


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

如果你想复制完整的结构,一个更高级的方法是:

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

这将为您提供完整的create语句文本,您可以根据需要对其进行修改以创建新表。你必须改变表的名字,当然还有所有的约束。

(你也可以在旧版本中使用EXP/IMP来做到这一点,但现在更容易了。)

编辑添加 如果您要查找的表在不同的模式中:

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

简单地写一个查询:

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

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

创建表xyz_new作为select * from xyz;

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

Delete from xyz_new;

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

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