我知道这句话:
create table xyz_new as select * from xyz;
它复制了结构和数据,但如果我只想要结构呢?
我知道这句话:
create table xyz_new as select * from xyz;
它复制了结构和数据,但如果我只想要结构呢?
当前回答
没有表数据的复制
create table <target_table> as select * from <source_table> where 1=2;
复制表数据
create table <target_table> as select * from <source_table>;
其他回答
我使用的方法,你接受了很多,但有人指出,它不复制约束(除了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 xyz_new as select * from xyz where rownum = -1;
避免反复迭代,并在1=2的条件下不插入任何内容
以上任务可以通过两个简单步骤完成。
步骤1:
CREATE table new_table_name AS(Select * from old_table_name);
上面的查询创建了一个表的副本(包括内容)。
若要获得结构,使用删除表的内容。
步骤2:
DELETE * FROM new_table_name.
希望这能解决你的问题。感谢之前的帖子。给了我很多启发。
只需使用一个where子句,它不会选择任何行:
create table xyz_new as select * from xyz where 1=0;
限制
以下内容不会被复制到新表中:
序列 触发器 索引 有些约束可能无法复制 物化视图日志
这也不能处理分区
通过其他方式,您可以从下面列出的命令获取表创建的ddl,并执行创建。
SELECT DBMS_METADATA.GET_DDL('TYPE','OBJECT_NAME','DATA_BASE_USER') TEXT FROM DUAL
类型是表,程序等。
使用这个命令,您可以从数据库对象中获得大部分ddl。