我知道这句话:

create table xyz_new as select * from xyz;

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


当前回答

我使用的方法,你接受了很多,但有人指出,它不复制约束(除了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;

其他回答

我使用的方法,你接受了很多,但有人指出,它不复制约束(除了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 abc_new as select * from abc; 

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

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

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

没有表数据的复制

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

复制表数据

create table <target_table> as select * from <source_table>;
SELECT * INTO newtable
FROM oldtable
WHERE 1 = 0;

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