我知道声明:
create table xyz_new as select * from xyz;
哪个复制结构和数据,但如果我只想要结构呢?
create table xyz_new as select * from xyz where rownum = -1;
为了避免反复迭代并根据1 = 2的条件插入任何内容
使用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;
这将为您提供完整的创建语句文本,您可以根据需要修改该文本以创建新表 . 您当然必须更改表的名称和所有约束 .
(您也可以使用EXP / IMP在旧版本中执行此操作,但现在更容易了 . )
Edited to add 如果您所使用的表位于不同的架构中:
SELECT dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ) FROM DUAL;
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 New_table as select * from Old_table where 1=2 ; but be careful 你创建的表没有像old_table那样的任何Index,Pk等等
Create table New_table as select * from Old_table where 1=2 ;
SELECT * INTO newtable FROM oldtable WHERE 1 = 0;
使用另一个模式创建一个新的空表 . 只需添加一个WHERE子句,使查询不返回任何数据:
只需编写如下查询:
create table new_table as select * from old_table where 1=2;
其中 new_table 是要创建的新表的名称, old_table 是要复制其结构的现有表的名称,这将仅复制结构 .
new_table
old_table
WHERE 1 = 0 或类似的虚假条件有效,但我不喜欢它们的样子 . 适用于Oracle 12c恕我直言的更清晰的代码是
WHERE 1 = 0
CREATE TABLE bar AS SELECT * FROM foo FETCH FIRST 0 ROWS ONLY;
同样的限制适用:只将列定义及其可为空性复制到新表中 .
你也可以做一个
create table abc_new as select * from abc;
然后截断表 abc_new . 希望这足以满足您的要求 .
abc_new
Create table target_table As Select * from source_table where 1=2;
Source_table是你要复制结构的表 .
使用pl / sql开发人员,您可以在sql工作区或对象资源管理器中右键单击table_name,然后单击“view”,然后单击“view sql”,生成sql脚本以创建表以及所有约束,索引,分区等..
接下来,使用new_table_name运行脚本
在其他方面,您可以从下面列出的命令获取表创建的ddl,并执行创建 .
SELECT DBMS_METADATA.GET_DDL('TYPE','OBJECT_NAME','DATA_BASE_USER') TEXT FROM DUAL TYPE is ('TABLE','PROCEDURE', etc...)
使用此命令,您可以从数据库对象中获取大部分ddl .
没有表数据的
create table <target_table> as select * from <source_table> where 1=2;
create table <target_table> as select * from <source_table>;
上述任务可以通过两个简单的步骤完成 .
CREATE table new_table_name AS(Select * from old_table_name);
上面的 query 创建了表的副本(也包含内容) .
query
要获取结构,请使用删除表的内容 .
DELETE * FROM new_table_name.
希望这能解决你的问题 . 并感谢早先的帖子 . 给了我很多洞察力 .
15 回答
为了避免反复迭代并根据1 = 2的条件插入任何内容
使用sql developer选择表并单击DDL选项卡
在sql工作表中运行它时,可以使用该代码创建一个没有数据的新表
sqldeveloper是oracle免费使用的应用程序 .
如果表有序列或触发器,ddl有时也会为你生成序列或触发器 . 你必须要小心你的命令,并知道何时打开或关闭触发器 .
只需使用不会选择任何行的where子句:
限制
以下内容不会复制到新表中:
序列
触发器
索引
某些约束可能无法复制
物化视图日志
这也不处理分区
我使用了你接受了很多的方法,但有人指出它不会复制约束(除了NOT NULL,我认为) .
如果要复制完整结构,则更高级的方法是:
这将为您提供完整的创建语句文本,您可以根据需要修改该文本以创建新表 . 您当然必须更改表的名称和所有约束 .
(您也可以使用EXP / IMP在旧版本中执行此操作,但现在更容易了 . )
Edited to add 如果您所使用的表位于不同的架构中:
你可以这样做
Create table New_table as select * from Old_table where 1=2 ;
but be careful 你创建的表没有像old_table那样的任何Index,Pk等等使用另一个模式创建一个新的空表 . 只需添加一个WHERE子句,使查询不返回任何数据:
只需编写如下查询:
其中
new_table
是要创建的新表的名称,old_table
是要复制其结构的现有表的名称,这将仅复制结构 .WHERE 1 = 0
或类似的虚假条件有效,但我不喜欢它们的样子 . 适用于Oracle 12c恕我直言的更清晰的代码是CREATE TABLE bar AS SELECT * FROM foo FETCH FIRST 0 ROWS ONLY;
同样的限制适用:只将列定义及其可为空性复制到新表中 .
你也可以做一个
然后截断表
abc_new
. 希望这足以满足您的要求 .Source_table是你要复制结构的表 .
使用pl / sql开发人员,您可以在sql工作区或对象资源管理器中右键单击table_name,然后单击“view”,然后单击“view sql”,生成sql脚本以创建表以及所有约束,索引,分区等..
接下来,使用new_table_name运行脚本
在其他方面,您可以从下面列出的命令获取表创建的ddl,并执行创建 .
使用此命令,您可以从数据库对象中获取大部分ddl .
没有表数据的
副本
与表数据一起复制
上述任务可以通过两个简单的步骤完成 .
第1步:
上面的
query
创建了表的副本(也包含内容) .要获取结构,请使用删除表的内容 .
第2步:
希望这能解决你的问题 . 并感谢早先的帖子 . 给了我很多洞察力 .