Answers:
只需使用不会选择任何行的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;
My_table_name
是现有的表格。但是,如何获得创建的新表的名称?
new_table = dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ).
同时,请让我知道LONG在这里做什么。
使用sql developer选择表并单击DDL选项卡
在sql工作表中运行该表时,可以使用该代码创建没有数据的新表
sqldeveloper是来自oracle的免费使用的应用程序。
如果表中包含序列或触发器,则ddl有时也会为您生成序列或触发器。您只需要注意按什么顺序排列它们,并知道何时打开或关闭触发器。
SQL
以其他方式,您可以从下面列出的命令中获取表创建的ddl,然后执行创建。
SELECT DBMS_METADATA.GET_DDL('TYPE','OBJECT_NAME','DATA_BASE_USER') TEXT FROM DUAL
TYPE
是TABLE
,PROCEDURE
等等。使用此命令,您可以从数据库对象中获取大多数ddl。
GET_DDL
区分大小写。
Create table target_table
As
Select *
from source_table
where 1=2;
Source_table是您要复制其结构的表。
使用pl / sql developer,您可以在sql工作区或对象资源管理器中右键单击table_name,然后单击“ view”,然后单击“ view sql”,这将生成sql脚本以创建带有所有约束的表,索引,分区等。
接下来,您使用new_table_name运行脚本
- 创建表xyz_new作为select * from xyz;
-这将创建表并复制所有数据。
- 从xyz_new删除;
-这将具有相同的表结构,但所有复制的数据将被删除。
如果要克服答案指定的限制: 如何在不复制数据的情况下创建Oracle表的副本?
上面的任务可以通过两个简单的步骤完成。
CREATE table new_table_name AS(Select * from old_table_name);
在query
上述创建一个表的副本(具有内容以及)。
要获取结构,请使用删除表的内容。
DELETE * FROM new_table_name.
希望这能解决您的问题。还要感谢之前的帖子。给了我很多见识。
truncate
版本效率低。除了为所有数据分配扩展区之外,您还没有通过删除来释放它们,因此,除非表增长到旧的大小,否则可能浪费空间。并且您在插入和删除上都生成撤消/重做。吉姆的回答很简单地避免了所有这些。