如何在不复制数据的情况下创建Oracle表的副本?

我知道这句话:

create table xyz_new as select * from xyz;

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

654921 次浏览

使用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来做到这一点,但现在更容易了。)

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

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

你也可以做

create table abc_new as select * from abc;

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

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

步骤1:

CREATE table new_table_name AS(Select * from old_table_name);

上面的query创建了一个表的副本(以及内容)。

若要获得结构,使用删除表的内容。

步骤2:

DELETE * FROM new_table_name.

希望这能解决你的问题。感谢之前的帖子。给了我很多启发。

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

避免反复迭代,并在1=2的条件下不插入任何内容

简单地写一个查询:

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

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

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

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

使用pl/sql开发器,你可以在sql工作区或对象资源管理器中右键单击table_name,然后单击“查看”,然后单击“查看sql”,它会生成sql脚本来创建包含所有约束、索引、分区等的表。

接下来使用new_table_name运行脚本

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

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

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

你可以的 Create table New_table as select * from Old_table where 1=2 ; 但是要小心 您创建的表没有任何Index, PK等像old_table.

    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;

没有表数据的复制

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子句,导致查询不返回数据:

WHERE 1 = 0或类似的虚假条件工作,但我不喜欢他们的样子。Oracle 12c+ IMHO的代码稍微干净一些

< p > <代码> 创建表栏AS SELECT * 从foo 只获取前0行; < /代码> < / p >

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

  1. 创建表xyz_new作为select * from xyz;

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

  1. Delete from xyz_new;

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

如果你想克服answer指定的限制: 如何在不复制数据的情况下创建Oracle表的副本? < / p >

如果只需要为交换分区创建一个表(空结构),最好使用"..交换. .“条款。不过它只能从Oracle version 12.2 . txt开始使用。

CREATE TABLE t1_temp FOR EXCHANGE WITH TABLE t1;

如果正常的CTAS操作没有精确地复制表结构,则在“交换分区”期间无缝地处理“ORA-14097”。我看到甲骨文遗漏了一些“DEFAULT"列和“hidden”;原始表中的列定义。

ORA-14097: ALTER TABLE EXCHANGE中的列类型或大小不匹配 分区< / p >

进一步阅读