我知道这句话:
create table xyz_new as select * from xyz;
它复制了结构和数据,但如果我只想要结构呢?
我知道这句话:
create table xyz_new as select * from xyz;
它复制了结构和数据,但如果我只想要结构呢?
当前回答
使用pl/sql开发器,你可以在sql工作区或对象资源管理器中右键单击table_name,然后单击“查看”,然后单击“查看sql”,它会生成sql脚本来创建包含所有约束、索引、分区等的表。
接下来使用new_table_name运行脚本
其他回答
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;
我使用的方法,你接受了很多,但有人指出,它不复制约束(除了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 target_table
As
Select *
from source_table
where 1=2;
Source_table是你要复制其结构的表。
你可以这样做 创建表New_table为select * from Old_table 但是要小心 您创建的表不像old_table那样具有任何Index、PK等。
通过其他方式,您可以从下面列出的命令获取表创建的ddl,并执行创建。
SELECT DBMS_METADATA.GET_DDL('TYPE','OBJECT_NAME','DATA_BASE_USER') TEXT FROM DUAL
类型是表,程序等。
使用这个命令,您可以从数据库对象中获得大部分ddl。