如何在不复制数据的情况下创建 Oracle 表的副本?
-
04-07-2019 - |
题
我知道这样的说法:
create table xyz_new as select * from xyz;
它复制结构和数据,但如果我只想要结构怎么办?
解决方案
只需使用不会选择任何行的 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在旧版本中执行此操作,但现在更容易了。)
已编辑添加 如果您所使用的表位于不同的模式中:
SELECT dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ) FROM DUAL;
使用sql developer选择表并单击DDL选项卡
在sql工作表中运行时,可以使用该代码创建一个没有数据的新表
sqldeveloper是oracle中免费使用的应用程序。
如果表中有序列或触发器,ddl有时也会为您生成序列或触发器。你必须要小心你的命令,并知道何时打开或关闭触发器。
create table xyz_new as select * from xyz where rownum = -1;
一次又一次地避免迭代,并根据1 = 2
的条件不插入任何内容 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;
你可以这样做 <代码> 将表New_table创建为 从Old_table中选择*,其中1 = 2; 代码> 但要小心 您创建的表没有像old_table
那样的任何Index,Pk等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
是要复制其结构的现有表的名称,这将复制只有结构。
WHERE 1 = 0
或类似的错误条件有效,但我不喜欢它们的样子。适用于Oracle 12c + IMHO的更清晰的代码是
<代码> CREATE TABLE栏AS 选择 * 来自foo FETCH FIRST 0行; 代码>
同样的限制适用:只有列定义及其可为空性被复制到新表中。
你也可以做一个
create table abc_new as select * from abc;
然后截断表 abc_new
。希望这足以满足您的要求。
Create table target_table
As
Select *
from source_table
where 1=2;
Source_table是你要复制结构的表。
使用pl / sql开发人员,您可以在sql工作区或对象资源管理器中右键单击table_name,而不是单击“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>;
上述任务可以通过两个简单的步骤完成。
第1步:
CREATE table new_table_name AS(Select * from old_table_name);
上面的查询
会创建一个表的副本(也包含内容)。
要获取结构,请使用。
删除表的内容第2步:
DELETE * FROM new_table_name.
希望这能解决您的问题。并感谢早先的帖子。给了我很多见解。